Alamat gudang dokumen: https://github.com/hfcorriez/fig-standards
Spesifikasi PSR versi Cina
1.1. Contoh
Contoh ini mengandungi paparan ringkas beberapa peraturan di atas:
kelas Foo extends Bar melaksanakan FooInterface
{
public function sampleFunction($a, $b = null)
{
if ($a === $b) {
bar ();
} elseif ($a > $b) {
);
}
}
bar fungsi statik awam akhir() {
// badan kaedah
}
}
Kod mesti mematuhi semua peraturan PSR-1.
2.2 Fail
Semua fail PHP mesti berakhir dengan baris kosong.
Teg penutup fail untuk kod PHP tulen?>Mesti ditinggalkan
2.3. Baris
Tidak boleh ada had keras pada panjang talian.
Had lembut pada panjang baris mestilah 120 aksara; untuk had lembut, penyemak gaya automatik mesti memberi amaran tetapi bukan ralat.
Panjang baris sebenar tidak boleh melebihi 80 aksara;
Semestinya tiada ruang selepas garisan tidak kosong.
Baris kosong boleh digunakan untuk meningkatkan kebolehbacaan dan membezakan blok kod yang berkaitan.
Tidak boleh ada lebih daripada satu pernyataan setiap baris.
2.4. Lekukan
Kod mesti menggunakan 4 ruang untuk lekukan dan aksara tab tidak boleh digunakan sebagai lekukan.
Nota: Hanya menggunakan ruang, tidak bercampur dengan tab, akan membantu mengelakkan beberapa masalah dalam perbezaan kod, tampung, sejarah dan ulasan. Menggunakan ruang putih juga menjadikannya sangat mudah untuk melaraskan lekukan halus untuk meningkatkan penjajaran antara baris.
2.5. Kata kunci dan Benar/Salah/Nol
kata kunci PHP mestilah huruf kecil.
Pemalar PHP benar, palsu dan null mestilah huruf kecil.
3. Ruang nama dan Pengisytiharan Penggunaan
Jika ada, mesti ada baris kosong selepas pengisytiharan ruang nama.
Jika ada, semua pernyataan penggunaan mesti diletakkan di bawah pernyataan ruang nama.
Kata kunci penggunaan mesti digunakan dalam satu perisytiharan sahaja.
Mesti ada baris kosong selepas blok pengisytiharan penggunaan.
Contoh:
gunakan OtherVendorOtherPackageBazClass;
// ... kod PHP tambahan ...
4.1. Sambungan dan warisan
Kurung kerinting kiri kelas mesti diletakkan pada barisnya sendiri di bawah;
// pemalar, sifat, kaedah
}
gunakan OtherVendorOtherPackageBazClass;
className kelas melanjutkan pelaksanaan ParentClass
Countable,
Serializable
{
// pemalar, sifat, kaedah
}
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. Kontrollstruktur
Die Stilregeln für Kontrollstrukturen sind wie folgt zusammengefasst:
Nach dem Schlüsselwort der Kontrollstruktur muss ein Leerzeichen stehen.
Nach der linken Klammer darf kein Leerzeichen stehen.
Vor der rechten Klammer darf kein Leerzeichen stehen.
Zwischen der rechten Klammer und muss ein Leerzeichen stehen die linke geschweifte Klammer
Code Der Körper muss einmal eingerückt werden
Die schließende geschweifte Klammer muss eine Zeile unter dem Körper stehen
Der Körper jeder Struktur muss in geschweifte Klammern eingeschlossen sein. Diese Struktur sieht standardisierter aus und verringert die Möglichkeit von Fehlern beim Hinzufügen neuer Zeilen.
5.1. if, elseif, else
Eine if-Struktur sollte wie folgt aussehen. Achten Sie auf die Platzierung von Klammern, Leerzeichen und geschweiften Klammern; sonst und elseif stehen auf derselben Zeile wie die schließende geschweifte Klammer des vorherigen Textkörpers.
Das Schlüsselwort elseif sollte anstelle von else if verwendet werden, um alle Kontrollschlüsselwörter als ein Wort beizubehalten.
5.2. Schalter, Gehäuse
Eine Schalterstruktur sollte wie folgt aussehen. Achten Sie auf Klammern, Leerzeichen und geschweifte Klammern. Die Case-Anweisung muss vom Schalter aus eingerückt sein, und das Schlüsselwort break (oder ein anderes Schlüsselwort break) muss auf derselben Ebene wie der Case-Körper eingerückt sein. Wenn ein nicht leerer Fallkörper herunterfällt, muss ein Kommentar wie // no break vorhanden sein.
5.4. for
Eine for-Anweisung sollte wie folgt aussehen. Achten Sie auf die Platzierung von Klammern, Leerzeichen und geschweiften Klammern.
Eine foreach-Anweisung sollte wie folgt aussehen. Achten Sie auf die Platzierung von Klammern, Leerzeichen und geschweiften Klammern.
6. Schließung
Nach dem Funktionsschlüsselwort muss beim Deklarieren des Abschlusses ein Leerzeichen stehen, und vor der Verwendung ist auch ein Leerzeichen erforderlich.
Die öffnende geschweifte Klammer muss sich auf derselben Zeile befinden und die schließende geschweifte Klammer muss sich auf der nächsten Zeile des Körpers befinden.
Nach den linken Klammern von Parameterlisten und Variablenlisten dürfen keine Leerzeichen stehen, und vor den rechten Klammern dürfen keine Leerzeichen stehen.
In Parameterlisten und Variablenlisten dürfen vor dem Komma keine Leerzeichen und nach dem Komma müssen Leerzeichen stehen.
Parameter von Abschlüssen mit Standardwerten müssen nach der Parameterliste platziert werden.
Eine Abschlusserklärung sollte wie folgt aussehen. Achten Sie auf die Platzierung von Klammern, Leerzeichen und geschweiften Klammern.
Parameter- und Variablenlisten können mit einer Einrückung in mehrere aufeinanderfolgende Zeilen aufgeteilt 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 oder eine Variable in einer Zeile platziert werden.
Wenn die endgültige Liste (ob Parameter oder Variablen) in mehrere Zeilen unterteilt ist, müssen die rechte Klammer und die linke geschweifte Klammer in einer eigenen Zeile mit einem Leerzeichen platziert werden.
Unten finden Sie ein Beispiel für eine Parameter- und Variablenliste, die in mehrere Zeilen aufgeteilt ist.
$noArgs_longVars = function () use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_longVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use (
$longVar1,
$longerVar2,
$muchLongerVar 3
) {
// Körper
};
$longArgs_shortVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use ($var1) {
// body
};
$shortArgs_longVars = function ($arg) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
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 gauche 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 : Lequel vient en premier, statique ou visibilité, lors de la définition d'une méthode ?
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 : Une ligne vide est-elle requise après la balise d'ouverture de PHP ?
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