PSR-0 (Autoloading Standard) 自动加载标准PSR-1 (Basic Coding Standard) 根本编码标准PSR-2 (Coding Style Guide) 编码风格引导PSR-3 (Logger Interface) 日志接口PSR-4 (Improved Autoloading) 自动加载的增强版,可以更换掉PSR-0了。
2. 规范的利用和定义1. PSR-0规范
PSR-0是第一套规范,紧张用于规范自动加载,不过现在已经由时了,被PSR-4规范替代了。 PSR-0逼迫性哀求几点:
1. 一个完备合格的namespace和class必须符合这样的构造:“\< Vendor Name>(< Namespace>)< Class Name>”2. 每个namespace必须有一个顶层的namespace("Vendor Name"供应者名字)3. 每个namespace可以有多个子namespace4. 当从文件系统中加载时,每个namespace的分隔符(\)要转换成 DIRECTORY_SEPARATOR(操作系统路径分隔符)5. 在类名中,每个下划线(_)符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(_)符号是没有(分外)意义的。6. 当从文件系统中载入时,合格的namespace和class一定因此 .php 结尾的7. verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)
第一条: 一个完备合格的namespace和class必须符合这样的构造:“\< Vendor Name>(< Namespace>)< Class Name>”
如果我的文件路径为Lib/Driver/Config.php,那么我的namespace的申明和利用为:
申明:namespace \Lib\Driver;利用:use \Lib\Driver\Config;
第二三条:每个namespace必须有一个顶层的namespace(”Vendor Name”供应者名字),每个namespace可以有多个子namespace
namespace \Lib\Driver\Config->/path/to/vender/Lib/Driver/Config.php
Lib便是顶层namespace,Driver便是子namespace/
第四条:当从文件系统中加载时,每个namespace的分隔符()要转换成 DIRECTORY_SEPARATOR(操作系统路径分隔符)
new \Lib\Driver\Config->转换的目录为/Lib/Driver/Config.php,更换反斜杠为目录分隔符
第五条:在类名中,每个下划线(_)符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(_)符号是没有(分外)意义的
\Lib\Driver\Class_Name->转换为目录为/Lib/Driver/Class/Name.php\Lib\Package_Name\Class_Name->转换为目录为/Lib/Package_Name/Class/Name.php
目录中的_便是下划线,classname中的下划线实际上会转为成路径分隔符。
但这个规定在PSR-4中已经取消了,不再须要转换了。第六条:当从文件系统中载入时,合格的namespace和class一定因此 .php 结尾的加载的文件必须是.php结尾,既然利用php当然是.php结尾了。不再像以前那样有什么php3,php5
第七条:verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)由于Liunx是区分大小写的,而windows是不区分大小写的,以是如果不把稳大小写在win下正常开拓,但是到了做事器上可能就无法正常实行了。
2. PSR-1规范哀求:
1. PHP源文件必须只利用 <?php 和 <?= 这两种标签。2. 源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。3. 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副浸染的操作(例如:输出信息,修正.ini配置等),但不建议同时做这两件事。4. 命名空间(namespace)和类(class) 必须遵守PSR-0标准。5. 类名(class name) 必须利用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。6. 类(class)中的常量必须只由大写字母和下划线(_)组成。7. 方法名(method name) 必须利用驼峰式(cameCase)写法。
第一条: PHP源文件必须只利用 <?php 和 <?= 这两种标签
由于php有4种标签形式,以是这里规定了利用哪一种,统一规范。
第二条:源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8windows条记本默认是会在文件头部加入BOM头的,会导致在做事器上输出得很奇怪。 海内的中文编码是GBK,UTF-8是国际通用编码,分歧一的话也会导致乱码。
第三条:一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副浸染的操作(例如:输出信息,修正.ini配置等),但不建议同时做这两件事。不要在一个文件中又是定义函数又是修正系统配置的,一个文件只做一件事。
// 副浸染:修正了ini配置ini_set('error_reporting', E_ALL);// 副浸染:载入了文件include "file.php";// 副浸染:产生了输出echo "<html>\n";// 声明 functionfunction foo(){ // 函数体}
分开写
// 声明 functionfunction foo(){ // 函数体}
// 副浸染:修正了ini配置ini_set('error_reporting', E_ALL);
// 副浸染:载入了文件include "file.php";
这样就很整洁。
第四条:命名空间(namespace)和类(class) 必须遵守PSR-0标准拜会PSR-0标准
第五条:类名(class name) 必须利用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。类名必须利用驼峰命名,大驼峰小驼峰都可以。
<?phpclass BigHouse{}
第六条:类(class)中的常量必须只由大写字母和下划线(_)组成。
<?phpclass Test{ const USER_INFO = 'xx'; const NAME = 'xx';}
第七条:方法名(method name) 必须利用驼峰式(cameCase)写法。
<?phpclass Test{ public function getUserInfo(){}}
总结:虽然规范里没有规定利用大驼峰还是小驼峰,不过我的开拓习气是class name大驼峰,method name小驼峰
3. PSR-2 规范PSR-2用于约束代码风格,代码必须遵照PSR-1 中列出的所有规则。
1. 源文件文件末端必须空一行。必须利用Unix LF(换行)作为行结束符。纯PHP代码源文件的关闭标签?>必须省略。2. 行行长不得有硬性限定。行长度的软限定必须是 120 个字符;自动样式检讨器必须警告但不能在软限定处出错。行不应超过 80 个字符;超过此长度的行应拆分为多行,每行不超过 80 个字符。非空行的末端不得有尾随空格。可以添加空行以提高可读性并指示干系的代码块。每行不得超过一个语句。3. 缩进代码必须利用 4 个空格的缩进,并且不得利用制表符进行缩进。当代编辑器都可以设置。
把稳:仅利用空格,而不是将空格与制表符稠浊利用,有助于避免差异、补丁、历史记录和注释方面的问题。空格的利用还可以轻松插入细粒度的子缩进以进行行间对齐。
4. 关键字和 True/False/NullPHP关键字必须小写。PHP 常量true、false和null必须小写。5. 命名空间的利用和声明命名空间(namespace)的声明后面必须有一行空行。所有的导入(use)声明必须放在命名空间(namespace)声明的下面。一句声明中,必须只有一个导入(use)关键字。在导入(use)声明代码块后面必须有一行空行。<?phpnamespace Vendor\Package;//下面必须空一行use FooClass;//use放在namespace下面use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;//use下面也要空一行// ... additional PHP code ...
6. 类、属性和方法继续(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写。
<?phpnamespace Vendor\Package;use FooClass;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;//写在一行class ClassName extends ParentClass implements \ArrayAccess, \Countable{//花括号换行写 // constants, properties, methods}
implements有多个时可以写成多行,但要担保第一个必须不才一行。每行只能写一个接口,每行都要缩进。
<?phpnamespace Vendor\Package;use FooClass;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;class ClassName extends ParentClass implements \ArrayAccess,//第一个接口就要写不才一行,把稳缩进 \Countable, \Serializable{ // constants, properties, methods}
属性必须声明可见性,public还是private还是protected,不能省略。也不能利用var, var是php老版本中的什么办法,等用于public。属性名称不应以单个下划线为前缀来表示受保护或私有可见性。每个语句不能声明多个属性。
<?phpnamespace Vendor\Package;class ClassName{ public $foo = null;}
方法(method) ,必须 声明其可见性,到底是 public 还是protected还是 private,不能省略。并且,花括号{必须换行写。如果有多个参数,第一个参数后紧接, 再加个空格,如果参数有默认值,也要用旁边空格分开。
<?phpnamespace Vendor\Package;class ClassName{ public function fooBarBaz($arg1, &$arg2, $arg3 = []) { // method body }}
参数列表可以分成多行,和接口多行一样须要缩进。参数多行时做花括号不用换行写,但是要在右括号后空一格。如下:
<?phpnamespace Vendor\Package;class ClassName{ public function aVeryLongMethodName( ClassTypeHint $arg1, &$arg2, array $arg3 = [] ) { // method body }}
当用到抽象(abstract)和闭幕(final)来做类声明时,它们必须放在可见性声明 (public 还是protected还是 private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。
<?phpnamespace Vendor\Package;abstract class ClassName{ protected static $foo; //static润色符放到可见性声明后面 abstract protected function zim();//abstract 放到前面 final public static function bar()//final放到前面 { // method body }}
函数调用时,函数名称与左括号之间不得有空格,左括号后不得有空格,右括号前不得有空格。在参数列表中,每个逗号前不得有空格,每个逗号后必须有一个空格。参数列表可以分成多行,个中每个后续行缩进一次。这样做时,列表中的第一项必须不才一行,并且每行必须只有一个参数。
<?phpbar();$foo->bar($arg1);Foo::bar($arg2, $arg3);$foo->bar( $longArgument, $longerArgument, $muchLongerArgument);
7. 掌握构造掌握构培养是if,switch这种流程掌握。一样平常规则如下:掌握构造关键字后必须有一个空格左括号后不能有空格右括号前不能有空格右括号和左大括号之间必须有一个空格构造体必须缩进一次右大括号必须在正文之后的下一行1. if,elseif,else写法:
<?phpif ($expr1) { // if body} elseif ($expr2) { // elseif body} else { // else body;}
elseif该当连着写 不要写成else if,要看着像一个单词。
2. switch,case写法:<?phpswitch ($expr) {//括号前后都要有空格 case 0: echo 'First case, with a break'; break;//break要和上一行对齐 case 1: echo 'Second case, which falls through'; //没有break语句的要写注释no break // no break case 2: case 3: case 4: echo 'Third case, return instead of break'; return; default: echo 'Default case'; break;}
3. while,do while
<?phpwhile ($expr) { // structure body}do { // structure body;} while ($expr);
4. for,foreach
<?phpfor ($i = 0; $i < 10; $i++) { // for body}foreach ($iterable as $key => $value) { // foreach body}
5. try,catch
<?phptry { // try body} catch (FirstExceptionType $e) { // catch body} catch (OtherExceptionType $e) { // catch body}
8.闭包闭包必须在function关键字后用空格声明,关键字前后用空格声明use左大括号必须在同一行上,右大括号必须在正文之后的下一行。参数列表或变量列表的左括号后不得有空格,参数列表或变量列表的右括号前不得有空格。在参数列表和变量列表中,每个逗号前不能有一个空格,每个逗号后必须有一个空格。具有默认值的闭包参数必须放在参数列表的末端。参数列表和变量列表可以分成多行,个中每个后续行缩进一次。这样做时,列表中的第一项必须不才一行,并且每行必须只有一个参数或变量当输入的参数列表(无论是参数还是use的变量)被分成多行时,右括号和左括号必须放在它们自己的一行上,它们之间有一个空格。请把稳,当该函数或方法直接将闭包用作参数时,格式化规则也适用。
<?php$closureWithArgs = function ($arg1, $arg2) { // body};$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) { // body};//参数列表格式化$longArgs_noVars = function ( $longArgument, $longerArgument, $muchLongerArgument) { // body};$noArgs_longVars = function () use ( $longVar1, $longerVar2, $muchLongerVar3) { // body};$longArgs_longVars = function ( $longArgument, $longerArgument, $muchLongerArgument) use ( $longVar1, $longerVar2, $muchLongerVar3) { // body};$longArgs_shortVars = function ( $longArgument, $longerArgument, $muchLongerArgument) use ($var1) { // body};$shortArgs_longVars = function ($arg) use ( $longVar1, $longerVar2, $muchLongerVar3) { // body};//闭包作为参数传入$foo->bar( $arg1, function ($arg2) use ($var1) { // body }, $arg3);
4. PSR-3规范
PSR-3规范这天记库的通用接口,一样平常框架都帮我们做好了,理解即可。官网文档
5. PSR-4规范PSR-4也是自动加载规范,用来取代PSR-0的。
废除了PSR-0中便是目录分割符的写法,下划线在完备限定类名中是没有分外含义了。类文件名要以 .php 结尾。类名必须要和对应的文件名要千篇一律,大小写也要千篇一律。总结:psr-0,psr-4是自动加载规范,psr-1,psr-2是代码风格规范,psr-3这天记库接口。 平常事情中只管即便利用psr-1,psr-2规范来规范我们的代码风格。