문서 창고 주소: https://github.com/hfcorriez/fig-standards
PSR 사양 중국어 버전
1.1. 예
이 예에는 위의 규칙 중 일부가 간단하게 표시되어 있습니다.
class Foo는 Bar를 구현하고 FooInterface를 구현합니다
{
public function SampleFunction($a, $b = null)
{
if ($a === $b) {
bar ();
} elseif ($a > $b) {
);
}
}
final public static function bar()
// 메소드 본문
}
}
코드는 PSR-1의 모든 규칙을 준수해야 합니다.
2.2 파일
모든 PHP 파일은 빈 줄로 끝나야 합니다.
순수 PHP 코드의 파일 닫는 태그?>생략해야 합니다
2.3. 줄
줄 길이에는 엄격한 제한이 있을 수 없습니다.
줄 길이에 대한 소프트 제한은 120자여야 합니다. 자동 스타일 검사기는 경고를 표시하지만 오류는 발생하지 않습니다.
실제 줄 길이는 80자를 초과할 수 없습니다. 더 긴 줄은 80자 이하의 여러 후속 줄로 분할되어야 합니다.
공백이 아닌 줄 뒤에는 공백이 없어야 합니다.
빈 줄을 사용하면 가독성을 높이고 관련 코드 블록을 구분할 수 있습니다.
한 줄에 하나의 설명만 포함할 수 있습니다.
2.4. 들여쓰기
코드는 들여쓰기를 위해 공백 4개를 사용해야 하며, 탭 문자는 들여쓰기로 사용할 수 없습니다.
참고: 탭과 혼합하지 않고 공백만 사용하면 코드 차이, 패치, 기록 및 주석의 일부 문제를 방지하는 데 도움이 됩니다. 공백을 사용하면 미묘한 들여쓰기를 조정하여 줄 사이의 정렬을 개선하는 것도 매우 쉽습니다.
2.5. 키워드 및 True/False/Null
PHP 키워드는 소문자여야 합니다.
PHP 상수 true, false 및 null은 소문자여야 합니다.
3. 네임스페이스 및 사용 선언
있는 경우 네임스페이스 선언 뒤에 빈 줄이 있어야 합니다.
있는 경우 모든 use 문은 네임스페이스 문 아래에 배치되어야 합니다.
use 키워드는 하나의 선언에만 사용해야 합니다.
사용 선언 블록 뒤에는 빈 줄이 있어야 합니다.
예:
OtherVendorOtherPackageBazClass 사용;
// ... 추가 PHP 코드 ...
4.1. 확장 및 상속
클래스의 왼쪽 중괄호는 아래의 한 줄에 배치되어야 하며, 오른쪽 중괄호는 클래스 본문 뒤의 한 줄에 배치되어야 합니다.
// 상수, 속성, 메서드
}
OtherVendorOtherPackageBazClass 사용;
클래스 ClassName은 ParentClass 구현을 확장합니다
Countable,
직렬화 가능
{
// 상수, 속성, 메서드
}
4.2.속성
모든 속성은 가시성을 선언해야 합니다.
var 키워드는 속성을 선언하는 데 사용할 수 없습니다.
하나의 문으로 여러 속성을 선언할 수 없습니다.
속성 이름 앞에는 보호 또는 비공개 가시성을 나타내기 위해 단일 밑줄이 붙으면 안 됩니다.
속성 선언은 다음과 같습니다.
클래스 클래스명
{
public $foo = null;
}
4.3. 메소드
모든 메소드는 가시성을 선언해야 합니다.
메서드 이름은 보호 또는 비공개 가시성을 나타내기 위해 단일 밑줄만 사용해서는 안 됩니다.
메서드 이름 뒤에는 선언 뒤에 공백이 올 수 없습니다. 여는 중괄호는 아래의 자체 줄에 배치되어야 하며, 닫는 중괄호는 메서드 본문 아래의 자체 줄에 배치되어야 합니다. 왼쪽 괄호 뒤에 공백이 없어야 하며 오른쪽 괄호 앞에 공백이 없어야 합니다.
메서드 정의는 다음과 같아야 합니다. 대괄호, 쉼표, 공백 및 중괄호에 주의하세요.
class ClassName
{
공개 함수 fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// 메서드 본문
}
}
4.4.메소드 매개변수
매개변수 목록에서 쉼표 앞에는 공백이 없어야 하며, 쉼표 뒤에는 공백이 1개 있어야 합니다.
메소드에 기본값이 있는 매개변수는 매개변수 목록의 마지막에 배치되어야 합니다.
class ClassName
{
공용 함수 foo($arg1, &$arg2, $arg3 = [])
{
// 메서드 본문
}
}
매개변수 목록은 한 번의 들여쓰기로 여러 개의 후속 줄로 나눌 수 있습니다. 이렇게 하면 목록의 첫 번째 항목이 다음 줄에 배치되어야 하며 각 줄에는 하나의 매개변수만 배치되어야 합니다.
매개변수 목록이 여러 줄로 나누어질 때 오른쪽 괄호와 왼쪽 중괄호는 공백으로 함께 배치되어 자체 줄을 형성해야 합니다.
class ClassName
{
공용 함수 aVeryLongMethodName(
ClassTypeHint $arg1,
&$arg2,
) array $arg3 = []
) {
// 메소드 본문
}
}
4.5. abstract, final 및 static
있는 경우 추상 및 최종 선언은 가시성 선언 앞에 배치되어야 합니다.
있는 경우 정적 선언 뒤에 가시성 선언이 와야 합니다.
추상 클래스 ClassName
{
protected static $foo;
추상 보호 함수 zim();
final public static function bar()
{
// 메소드 본문
}
}
4.6. 메소드 및 함수 호출
메서드나 함수를 호출하려면 메소드 또는 함수 이름과 왼쪽 괄호 사이에 공백이 없어야 하고, 왼쪽 괄호 뒤에 공백이 없어야 하며, 오른쪽 괄호 앞에 공백이 없어야 합니다. 함수 목록에서 쉼표 앞에는 공백이 없어야 하며, 쉼표 뒤에는 공백이 1개 있어야 합니다.
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
매개변수 목록은 다음을 수행할 수 있습니다. 들여쓰기를 사용하여 후속 줄로 분할됩니다. 이렇게 하면 목록의 첫 번째 항목이 다음 줄에 배치되어야 하며 각 줄에는 정확히 하나의 인수가 있어야 합니다.
5. 제어 구조
제어 구조의 스타일 규칙은 다음과 같이 요약됩니다.
제어 구조 키워드 뒤에 공백이 있어야 합니다
왼쪽 괄호 뒤에 공백이 없어야 합니다
오른쪽 괄호 앞에 공백이 없어야 합니다
오른쪽 괄호와 오른쪽 괄호 사이에 공백이 있어야 합니다 왼쪽 중괄호
코드 본문은 한 번 들여쓰기해야 합니다.
닫는 중괄호는 본문 아래 한 줄에 있어야 합니다.
각 구조체의 본문은 중괄호로 묶어야 합니다. 이 구조는 더욱 표준화되어 보이고 새 줄을 추가할 때 오류가 발생할 가능성을 줄여줍니다.
5.1. if, elseif, else
if 구조는 다음과 같아야 합니다. 괄호, 공백 및 중괄호 배치에 주의하세요. else 및 elseif는 이전 본문의 닫는 중괄호와 같은 줄에 있습니다.
모든 제어 키워드를 한 단어로 유지하려면 else if 대신 elseif 키워드를 사용해야 합니다.
5.2.스위치, 케이스
스위치 구조는 다음과 같아야 합니다. 괄호, 공백, 중괄호에 주의하세요. Case 문은 스위치에서 들여쓰기되어야 하며, break 키워드(또는 다른 break 키워드)는 Case 본문과 동일한 수준에서 들여쓰기되어야 합니다. 비어 있지 않은 케이스 본문이 쓰러지면 // no break와 같은 주석이 있어야 합니다.
5.4.for
for 문은 다음과 같아야 합니다. 괄호, 공백, 중괄호의 배치에 주의하세요.
5.5.포리치
foreach 문은 다음과 같아야 합니다. 괄호, 공백, 중괄호의 배치에 주의하세요.
6. 폐쇄
클로저 선언 시 함수 키워드 뒤에 공백이 있어야 하며, 사용 전에도 공백이 필요합니다.
여는 중괄호는 같은 줄에 있어야 하고, 닫는 중괄호는 본문의 다음 줄에 있어야 합니다.
매개변수 목록, 변수 목록의 왼쪽 괄호 뒤에는 공백이 없어야 하며, 오른쪽 괄호 앞에는 공백이 없어야 합니다.
매개변수 목록 및 변수 목록에서는 쉼표 앞에는 공백이 없어야 하며, 쉼표 뒤에는 공백이 있어야 합니다.
기본값이 있는 클로저의 매개변수는 매개변수 목록 뒤에 배치되어야 합니다.
클로저 선언은 다음과 같아야 합니다. 괄호, 공백, 중괄호의 배치에 주의하세요.
매개변수 및 변수 목록은 한 번의 들여쓰기로 여러 개의 후속 줄로 분할할 수 있습니다. 이렇게 하면 목록의 첫 번째 항목이 다음 줄에 배치되어야 하고, 한 줄에 하나의 매개변수나 변수만 배치되어야 합니다.
최종 목록(매개변수 또는 변수)이 여러 줄로 나누어질 때 오른쪽 괄호와 왼쪽 중괄호는 공백을 두고 각각의 줄에 배치되어야 합니다.
다음은 여러 줄로 분할된 매개변수 및 변수 목록의 예입니다.
$noArgs_longVars = 함수() 사용(
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// 본문
};
$longArgs_longVars = 함수(
$longArgument,
$longerArgument,
$muchLongerArgument
) 사용(
$longVar1,
$longerVar2,
$muchLongerVar 3
) {
// 본문
};
$longArgs_shortVars = 함수(
$longArgument,
$longerArgument,
$muchLongerArgument
) 사용($var1) {
// 본문
};
$shortArgs_longVars = 함수 ($arg) 사용 (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// 본문
};
7. 结论
在该指南中有很多风格的元素和做法有意被忽略掉。这些包括但不局限于:
全局变量和全局常量的声明
方法声明
操作符和赋值
行间对齐
注释和文档块
类名给你前缀和后缀
最佳实践
以后的建议可以修改和扩展该指南以满足这些或其他风格的元素和实践。
附录A 调查
为了写这个风格指南,我们采用了调查个项目以确定共同的做法。这个调查在这里供他人查看。
A.1. 调查数据
url,http://www.horde.org/apps/horde/docs/CODING_STANDARDS,http://pear.php.net/manual/en/standards.php,http://solarphp.com/manual/appendix-standards.style,http://framework.zend.com/manual/en/coding-standard.html,http://symfony.com/doc/2.0/contributing/code/standards.html,http://www.ppi.io/docs/coding-standards.html,https://github.com/ezsystems/ezp-next/wiki/codingstandards,http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html,https://github.com/UnionOfRAD/lithium/wiki/Spec%3A-Coding,http://drupal.org/coding-standards,http://code.google.com/p/sabredav/,http://area51.phpbb.com/docs/31x/coding-guidelines.html,https://docs.google.com/a/zikula.org/document/edit?authkey=CPCU0Us&hgd=1&id=1fcqb93Sn-hR9c0mkN6m_tyWnmEvoswKBtSc0tKkZmJA,http://www.chisimba.com,n/a,https://github.com/Respect/project-info/blob/master/coding-standards-sample.php,n/a,Object Calisthenics for PHP,http://doc.nette.org/en/coding-standard,http://flow3.typo3.org,https://github.com/propelorm/Propel2/wiki/Coding-Standards,http://developer.joomla.org/coding-standards.html
voting,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,no,no,no,?,yes,no,yes
indent_type,4,4,4,4,4,tab,4,tab,tab,2,4,tab,4,4,4,4,4,4,tab,tab,4,tab
line_length_limit_soft,75,75,75,75,no,85,120,120,80,80,80,no,100,80,80,?,?,120,80,120,no,150
line_length_limit_hard,85,85,85,85,no,no,no,no,100,?,no,no,no,100,100,?,120,120,no,no,no,no
class_names,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,lower_under,studly,lower,studly,studly,studly,studly,?,studly,studly,studly
class_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,next,next,next,next,next,next,same,next,next
constant_names,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper
true_false_null,lower,lower,lower,lower,lower,lower,lower,lower,lower,upper,lower,lower,lower,upper,lower,lower,lower,lower,lower,upper,lower,lower
method_names,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel,lower_under,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel
method_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,same,next,next,next,next,next,same,next,next
control_brace_line,same,same,same,same,same,same,next,same,same,same,same,next,same,same,next,same,same,same,same,same,same,next
control_space_after,yes,yes,yes,yes,yes,no,yes,yes,yes,yes,no,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes
always_use_control_braces,yes,yes,yes,yes,yes,yes,no,yes,yes,yes,no,yes,yes,yes,yes,no,yes,yes,yes,yes,yes,yes
else_elseif_line,same,same,same,same,same,same,next,same,same,next,same,next,same,next,next,same,same,same,same,same,same,next
case_break_indent_from_switch,0/1,0/1,0/1,1/2,1/2,1/2,1/2,1/1,1/1,1/2,1/2,1/1,1/2,1/2,1/2,1/2,1/2,1/2,0/1,1/1,1/2,1/2
function_space_after,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no
closing_php_tag_required,no,no,no,no,no,no,no,no,yes,no,no,no,no,yes,no,no,no,no,no,yes,no,no
line_endings,LF,LF,LF,LF,LF,LF,LF,LF,?,LF,?,LF,LF,LF,LF,?,,LF,?,LF,LF,LF
static_or_visibility_first,static,?,static,either,either,either,visibility,visibility,visibility,either,static,either,?,visibility,?,?,either,either,visibility,visibility,static,?
control_space_parens,no,no,no,no,no,no,yes,no,no,no,no,no,no,yes,?,no,no,no,no,no,no,no
blank_line_after_php,no,no,no,no,yes,no,no,no,no,yes,yes,no,no,yes,?,yes,yes,no,yes,no,yes,no
class_method_control_brace,next/next/same,next/next/same,next/next/same,next/next/same,next/next/same,same/same/same,next/next/next,same/same/same,same/same/same,same/same/same,same/same/same,next/next/next,next/next/same,next/same/same,next/next/next,next/next/same,next/next/same,next/next/same,next/next/same,same/same/same,next/next/same,next/next/next
A.2. 调查说明
indent_type: 缩进类型。 tab = "使用制表符",2 or 4 = "空格数量"
line_length_limit_soft: 行长度的“软”限制,用字符。 ? = 不表示或者数字 no 意为不限制.
line_length_limit_hard: 行长度的"硬"限制,用字符。 ? = 不表示或者数字, no 意为不限制.
class_names: 类名如何命名 lower = 只是小写, lower_under = 小写加下划线, studly = 骆驼型.
class_brace_line : L'accolade ouvrante d'une classe doit-elle être placée sur la même ligne ou sur la ligne suivante ?
constant_names : Comment nommer les constantes de classe ? upper = majuscule plus délimiteur souligné.
true_false_null : Écrire en toutes lettres ou en majuscules ?
method_names : Comment nommer les méthodes ? camel = chameau, lower_under = minuscule plus délimiteur souligné.
method_brace_line : L'accolade ouvrante de la méthode est-elle sur la même ligne ou sur la ligne suivante ?
control_brace_line : L'accolade gauche de la structure de contrôle est-elle sur la même ligne ou sur la ligne suivante ?
control_space_after : Y a-t-il un espace après le mot-clé de la structure de contrôle ?
always_use_control_braces : toujours utiliser des accolades pour les structures de contrôle ?
else_elseif_line : lors de l'utilisation de else et elseif, doivent-ils être placés sur la même ligne ou sur la ligne suivante ?
case_break_indent_from_switch : combien de fois case et break sont-ils en retrait de l'instruction switch ?
function_space_after : Y a-t-il des espaces dans le nom de la fonction et le crochet gauche de l'appel de fonction ?
closing_php_tag_required : S'il s'agit d'un fichier PHP pur, fermer la balise ?>Est-ce obligatoire ?
line_endings : Quelles fins de ligne utiliser ?
static_or_visibility_first : lors de la définition d'une méthode, qui vient en premier, statique ou visibilité ?
control_space_parens : Dans l'expression de la structure de contrôle, y a-t-il un espace après le crochet gauche et avant le crochet droit ? oui = si ( $expr ), non = si ($expr).
blank_line_after_php : PHP a-t-il besoin d'une ligne vide après la balise de début ?
class_method_control_brace : La position de l'accolade gauche dans les classes, les méthodes et les structures de contrôle.
A.3. Résultats de l'enquête
indent_type :
onglet : 7
2 : 1
4 : 14
line_length_limit_soft :
?: 2
non : 3
75 : 4
80 : 6
85 : 1
100 : 1
120 : 4
150 : 1
line_length_limit_hard:
?: 2
non : 11
85 : 4
100 : 3
120 : 2
class_names:
?: 1
inférieur : 1
inférieur_under : 1
étudiant : 19
class_brace_line :
suivant : 16
identique : 6
constant_names :
supérieur : 22
true_false_null :
inférieur : 19
supérieur : 3
method_names : Chameau : 21
LOWER_UNDER : 1
Method_brace_line :
Suivant : 15
Idem : 7
Control_line_line :
NEXT : 4
Idem : 18
Control_space _Affter :
non : 2
oui : 20
always_use_control_braces :
non : 3
oui : 19
else_elseif_line :
suivant : 6
pareil : 16
case_break_in dent_from_switch :
0/1 : 4
1/1 : 4
1/2 : 14
function_space_after :
non : 22
closing_php_tag_required :
non : 19
oui : 3
line_endings :
? : 5
LF : 17
static_or_visibility_first :
?: 5
soit : 7
statique : 4
visibilité : 6
control_space_parens:
?: 1
non : 19
oui : 2
blank_line_after_php:
?: 1
non : 13
oui : 8
class_method_control_ brace :
suivant/suivant/suivant : 4
suivant/suivant/identique : 11
suivant/identique/identique : 1
identique/identique/identique : 6