Adresse des Dokumentenlagers: https://github.com/hfcorriez/fig-standards
PSR-Spezifikation, chinesische Version
1.1. Beispiel
Dieses Beispiel enthält eine einfache Darstellung einiger der oben genannten Regeln:
Klasse Foo erweitert Bar implementiert FooInterface
{
öffentliche Funktion sampleFunction($a, $b = null)
{
if ($a === $b) {
bar ();
} elseif ($a > $b) {
);
}
}
final public static function bar() {
// Methodenkörper
}
}
Der Code muss allen Regeln von PSR-1 entsprechen.
2.2 Dateien
Alle PHP-Dateien müssen mit einer Leerzeile enden.
Dateiabschluss-Tag für reinen PHP-Code?>Muss weggelassen werden
2.3. Zeile
Es kann keine feste Begrenzung der Zeilenlänge geben.
Die Soft-Grenze für die Zeilenlänge muss 120 Zeichen betragen; für die Soft-Grenze muss die automatische Stilprüfung eine Warnung, aber keine Fehlermeldung ausgeben.
Die tatsächliche Zeilenlänge sollte 80 Zeichen nicht überschreiten; längere Zeilen sollten in mehrere aufeinanderfolgende Zeilen mit nicht mehr als 80 Zeichen aufgeteilt werden.
Nach nicht leeren Zeilen dürfen keine Leerzeichen stehen.
Leerzeilen können verwendet werden, um die Lesbarkeit zu verbessern und zusammengehörige Codeblöcke zu unterscheiden.
Es sollte nicht mehr als eine Aussage pro Zeile geben.
2.4. Einrückung
Der Code muss 4 Leerzeichen für die Einrückung verwenden und Tabulatorzeichen können nicht als Einrückung verwendet werden.
Hinweis: Die ausschließliche Verwendung von Leerzeichen, nicht gemischt mit Tabulatoren, trägt dazu bei, einige Probleme bei Codeunterschieden, Patches, Verlauf und Kommentaren zu vermeiden. Durch die Verwendung von Leerzeichen ist es auch sehr einfach, subtile Einrückungen anzupassen, um die Ausrichtung zwischen Zeilen zu verbessern.
2.5. Schlüsselwörter und Wahr/Falsch/Null
PHP-Schlüsselwörter müssen in Kleinbuchstaben geschrieben werden.
PHP-Konstanten true, false und null müssen Kleinbuchstaben sein.
3. Namespace- und Verwendungsdeklarationen
Falls vorhanden, muss nach der Namespace-Deklaration eine Leerzeile stehen.
Falls vorhanden, müssen alle Use-Anweisungen unterhalb der Namespace-Anweisung platziert werden.
Ein use-Schlüsselwort darf nur in einer Deklaration verwendet werden.
Nach dem Verwendungsdeklarationsblock muss eine Leerzeile stehen.
Beispiel:
OtherVendorOtherPackageBazClass verwenden;
// ... zusätzlicher PHP-Code ...
4.1. Erweiterung und Vererbung
Die linke geschweifte Klammer der Klasse muss in einer eigenen Zeile darunter platziert werden; die rechte geschweifte Klammer muss in einer eigenen Zeile nach dem Klassenkörper platziert werden.
// Konstanten, Eigenschaften, Methoden
}
OtherVendorOtherPackageBazClass verwenden;
class ClassName erweitert ParentClass-Implementierungen
Countable,
Serializable
{
// Konstanten, Eigenschaften, Methoden
}
4.2. Attribute
Alle Attribute müssen Sichtbarkeit deklarieren.
Das Schlüsselwort var kann nicht zum Deklarieren von Attributen verwendet werden.
Eine Anweisung kann nicht mehrere Attribute deklarieren.
Eigenschaftsnamen sollte kein einzelner Unterstrich vorangestellt werden, um die geschützte oder private Sichtbarkeit anzuzeigen.
Eine Eigentumsdeklaration sollte so aussehen.
class ClassName
{
public $foo = null;
}
4.3. Methoden
Alle Methoden müssen Sichtbarkeit deklarieren.
Methodennamen sollten nicht nur einen einzelnen Unterstrich verwenden, um auf geschützte oder private Sichtbarkeit hinzuweisen.
Dem Methodennamen darf nach der Deklaration kein Leerzeichen folgen. Die öffnende geschweifte Klammer muss in einer eigenen Zeile darunter platziert werden, und die schließende geschweifte Klammer muss in einer eigenen Zeile unterhalb des Methodenkörpers platziert werden. Nach der linken Klammer und vor der rechten Klammer dürfen keine Leerzeichen stehen.
Eine Methodendefinition sollte wie folgt aussehen. Beachten Sie die Klammern, Kommas, Leerzeichen und geschweiften Klammern:
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// Methodenkörper
}
}
4.4. Methodenparameter
In der Parameterliste darf kein Leerzeichen vor dem Komma stehen und es muss ein Leerzeichen nach dem Komma stehen.
Parameter mit Standardwerten in Methoden müssen am Ende der Parameterliste platziert werden.
class ClassName
{
public function foo($arg1, &$arg2, $arg3 = [])
{
// Methodenkörper
}
}
Die Parameterliste kann mit einer Einrückung in mehrere aufeinanderfolgende Zeilen unterteilt werden. Wenn Sie dies tun, muss das erste Element in der Liste in der nächsten Zeile platziert werden und es darf nur ein Parameter in jeder Zeile platziert werden.
Wenn die Parameterliste in mehrere Zeilen unterteilt ist, müssen die rechte Klammer und die linke geschweifte Klammer mit einem Leerzeichen zusammengefügt werden, um eine eigene Zeile zu bilden.
class ClassName
{
public function aVeryLongMethodName(
ClassTypeHint $arg1,
&$arg2,
) array $arg3 = []
) {
// Methodenkörper
}
}
4.5. Zusammenfassung, endgültige und statische Erklärung
Wenn vorhanden, müssen abstrakte und endgültige Erklärungen vor der Sichtbarkeitserklärung platziert werden.
Falls vorhanden, muss auf eine statische Deklaration eine Sichtbarkeitsdeklaration folgen.
abstract class ClassName
{
protected static $foo;
abstrakte geschützte Funktion zim();
final public static function bar()
{
// Methodenkörper
}
}
4.6. Aufrufen von Methoden und Funktionen
Um eine Methode oder Funktion aufzurufen, darf zwischen dem Methoden- oder Funktionsnamen und der linken Klammer kein Leerzeichen stehen, kein Leerzeichen nach der linken Klammer und kein Leerzeichen vor der rechten Klammer. In der Funktionsliste darf vor dem Komma kein Leerzeichen und nach dem Komma muss ein Leerzeichen stehen.
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
Die Parameterliste kann werden mit einem Einzug in nachfolgende Zeilen aufgeteilt. Wenn Sie dies tun, muss das erste Element in der Liste in der nächsten Zeile platziert werden und jede Zeile muss genau ein Argument haben.
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: 클래스의 왼쪽 중괄호를 같은 줄에 배치해야 할까요, 아니면 다음 줄에 배치해야 할까요?
constant_names: 클래스 상수의 이름을 어떻게 지정하나요? upper = 대문자와 밑줄 구분 기호.
true_false_null: 모두 문자로 쓰나요, 아니면 모두 대문자로 쓰나요?
method_names: 메소드 이름을 어떻게 지정하나요? camel = 카멜 표기법, lower_under = 소문자 + 밑줄 구분 기호.
method_brace_line: 메소드의 여는 중괄호가 같은 줄에 있나요, 아니면 다음 줄에 있나요?
control_brace_line: 제어 구조의 왼쪽 중괄호가 같은 줄에 있나요, 아니면 다음 줄에 있나요?
control_space_after: 제어 구조 키워드 뒤에 공백이 있나요?
always_use_control_braces: 제어 구조에 항상 중괄호를 사용하시겠습니까?
else_elseif_line: else와 elseif를 사용할 때 같은 줄에 배치해야 하나요, 아니면 다음 줄에 배치해야 하나요?
case_break_indent_from_switch: switch 문에서 case 및 break를 몇 번 들여썼나요?
function_space_after: 함수 이름과 함수 호출의 왼쪽 대괄호에 공백이 있나요?
closing_php_tag_required: 순수 PHP 파일이라면 태그를 닫아야 할까요?>필수인가요?
line_endings: 어떤 줄 끝을 사용해야 할까요?
static_or_visibility_first: 메서드를 정의할 때 정적 또는 가시성 중 어느 것이 먼저 오나요?
control_space_parens: 제어 구조 표현식에서 왼쪽 괄호 뒤, 오른쪽 괄호 앞에 공백이 있나요? 예 = if( $expr ), 아니요 =if($expr).
blank_line_after_php: PHP의 여는 태그 뒤에 빈 줄이 필요합니까?
class_method_control_brace: 클래스, 메소드 및 제어 구조에서 왼쪽 중괄호의 위치입니다.
A.3. 설문조사 결과
indent_type:
탭: 7
2: 1
4: 14
line_length_limit_soft:
?: 2
no: 3
75:4
80:6
85:1
100:1
120:4
150:1
line_length_limit_hard:
?: 2
아니요 : 11
85: 4
100: 3
120: 2
class_names:
?: 1
lower: 1
lower_under: 1
Studly: 19
class_brace_line:
다음: 16
동일: 6
상수_이름:
상위: 22
true_false_null:
하위: 19
상위: 3
method_names: Camel: 21
LOWER_UNDER: 1
Method_brace_line:
Next: 15
Same: 7
Control_line_line:
NEXT: 4
Same: 18
Control_space _Affter :
아니요: 2
예: 20
always_use_control_braces:
아니요: 3
예: 19
else_elseif_line:
다음: 6
동일: 16
case_break_in dent_from_switch :
0/1: 4
1/1: 4
1/2: 14
function_space_after:
아니오: 22
closing_php_tag_required:
아니오: 19
예: 3
line_endings:
?: 5
LF: 17
static_or_visibility_first:
?: 5
둘 중 하나: 7
정적: 4
가시성: 6
control_space_parens:
?: 1
아니요: 19
예: 2
blank_line_after_php:
?: 1
아니요: 13
예: 8
class_method_control_ 중괄호:
다음/다음/다음: 4
다음/다음/동일: 11
다음/동일/동일: 1
동일/동일/동일: 6