参考文档:https://github.com/hfcorriez/fig-standards/tree/zh_CN/接受
是PHP Standard Recommendation的简写,它其实应该叫PSRs,即系列推荐标准:目前通过的规范有PSR-0(Autoloading Standard)、PSR-1(Basic Coding Standard)、PSR-2(Coding Style Guide)、PSR-3(Logger Interface)、PSR-4(Improved Autoloading)。它不是PHP官方标准,而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准,目前有越来有多的社区项目加入成员并遵循该标准。
PHP-FIG — PHP Framework Interoperability Group, 是制定PSRs开发规范的组织,它的成员由很多知名PHP社区项目组成,在其官网首页下方可以看到成员清单。这些成员制定规范,并且落实在自己的项目中。
必须(MUST),不可(MUST NOT),建议(SHOULD),不建议(SHOULD NOT),可以/可能(MAY)
1、命令空间规范 PSR-0
- 一个完全标准的命名空间(namespace)和类(class)的结构是这样的:\<Vendor Name>\(<Namespace>\)*<Class Name>
- 每个命名空间(namespace)都必须有一个顶级的空间名(namespace)(“组织名(Vendor Name)”)。
- 每个命名空间(namespace)中可以根据需要使用任意数量的子命名空间(sub-namespace)。
- 从文件系统中加载源文件时,空间名(namespace)中的分隔符将被转换为 DIRECTORY_SEPARATOR
- 类名(class name)中的每个下划线_都将被转换为一个DIRECTORY_SEPARATOR。下划线_在空间名(namespace)中没有什么特殊的意义。
- 完全标准的命名空间(namespace)和类(class)从文件系统加载源文件时将会加上.php后缀。
- 组织名(vendor name),空间名(namespace),类名(class name)都由大小写字母组合而成。
举例说明参考文档:
https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-0.md
2、基本代码规范 PSR-1
- 源文件必须只使用 <?php 和 <?= 这两种标签。
- 源文件中php代码的编码格式必须只使用不带字节顺序标记(BOM)的UTF-8。
- 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
- 命名空间(namespace)和类(class) 必须遵守PSR-0标准。
- 类名(class name) 必须使用骆驼式(StudlyCaps)写法 (译者注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
- 类(class)中的常量必须只由大写字母和下划线(_)组成。
- 方法名(method name) 必须使用驼峰式(cameCase)写法(译者注:后文将直接用camelCase表示)。
举例说明参考文档:
https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-1-basic-coding-standard.md
3、代码风格指南 PSR-2
- 代码必须遵守 PSR-1。
- 代码必须使用4个空格来进行缩进,而不是用制表符。
- 一行代码的长度不建议有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少。
- 在命名空间(namespace)的声明下面必须有一行空行,并且在导入(use)的声明下面也必须有一行空行
- 类(class)的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行。
- 方法(method)的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行。
- 所有的属性(property)和方法(method) 必须有可见性声明;抽象(abstract)和终结(final)声明必须在可见性声明之前;而静态(static)声明必须在可见性声明之后。
- 在控制结构关键字的后面必须有一个空格;而方法(method)和函数(function)的关键字的后面不可有空格。
- 控制结构的左花括号必须跟其放在同一行,右花括号必须放在该控制结构代码主体的下一行。
- 控制结构的左括号之后不可有空格,右括号之前也不可有空格。
详细说明:
- 所有的PHP源文件必须使用Unix LF(换行)作为行结束符。
所有PHP源文件必须以一个空行结束。
纯PHP代码源文件的关闭标签?> 必须省略。 - 行长度不可有硬限制。
行长度的软限制必须是120个字符;对于软限制,代码风格检查器必须警告但不可报错。
一行代码的长度不建议超过80个字符;较长的行建议拆分成多个不超过80个字符的子行。
在非空行后面不可有空格。
空行可以用来增强可读性和区分相关代码块。
一行不可多于一个语句。 - 代码必须使用4个空格,且不可使用制表符来作为缩进。
- PHP关键字(keywords)必须使用小写字母。
PHP常量true, false和null 必须使用小写字母。 - 命名空间(namespace)的声明后面必须有一行空行。
所有的导入(use)声明必须放在命名空间(namespace)声明的下面。
一句声明中,必须只有一个导入(use)关键字。
在导入(use)声明代码块后面必须有一行空行。 - 一个类的扩展(extend)和实现(implement)关键词必须和类名(class name)在同一行。
类(class)的左花括号必须放在下面自成一行;右花括号必须放在类(class)主体的后面自成一行。 - 所有的属性(property)都必须声明其可见性。
变量(var)关键字不可用来声明一个属性(property)。
一条语句不可声明多个属性(property)。
属性名(property name) 不推荐用单个下划线作为前缀来表明其保护(protected)或私有(private)的可见性。 - 所有的方法(method)都必须声明其可见性。
方法名(method name) 不推荐用单个下划线作为前缀来表明其保护(protected)或私有(private)的可见性。
方法名(method name)在其声明后面不可有空格跟随。其左花括号必须放在下面自成一行,且右花括号必须放在方法主体的下面自成一行。左括号后面不可有空格,且右括号前面也不可有空格。 - 在参数列表中,逗号之前不可有空格,而逗号之后则必须要有一个空格。
方法(method)中有默认值的参数必须放在参数列表的最后面。 - 当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明的前面。
而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。 - 调用一个方法或函数时,在方法名或者函数名和左括号之间不可有空格,左括号之后不可有空格,右括号之前也不可有空格。参数列表中,逗号之前不可有空格,逗号之后则必须有一个空格。
- 下面是对于控制结构代码风格的概括:
控制结构的关键词之后必须有一个空格。
控制结构的左括号之后不可有空格。
控制结构的右括号之前不可有空格。
控制结构的右括号和左花括号之间必须有一个空格。
控制结构的代码主体必须进行一次缩进。
控制结构的右花括号必须主体的下一行。
每个控制结构的代码主体必须被括在花括号里。这样可是使代码看上去更加标准化,并且加入新代码的时候还可以因此而减少引入错误的可能性。
推荐用elseif来替代else if,以保持所有的条件控制关键字看起来像是一个单词。 - 下面是一个switch条件控制结构的示例,注意其中括号,空格和花括号的位置。case语句必须要缩进一级,而break关键字(或其他中止关键字)必须和case结构的代码主体在同一个缩进层级。如果一个有主体代码的case结构故意的继续向下执行则必须要有一个类似于// no break的注释。
举例说明参考文档:
https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-2-coding-style-guide.md
4、日志接口 PSR-3
参考文档:https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-3-logger-interface.md
5、自动载入 PSR-4
这个 PSR 描述的是通过文件路径自动载入类的指南;它作为对 PSR-0 的补充;根据这个 指导如何规范存放文件来自动载入;
参考文档:https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-4-autoloader.md
1、术语「类」是一个泛称;它包含类,接口,traits 以及其他类似的结构;
2、完全限定类名应该类似如下范例:
<NamespaceName>(<SubNamespaceNames>)*<ClassName>
- 完全限定类名必须有一个顶级命名空间(Vendor Name);
- 完全限定类名可以有多个子命名空间;
- 完全限定类名应该有一个终止类名;
- 下划线在完全限定类名中是没有特殊含义的;
- 字母在完全限定类名中可以是任何大小写的组合;
- 所有类名必须以大小写敏感的方式引用;
3、当从完全限定类名载入文件时:
- 在完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录。
- 在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配;
- 终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配;
4、自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值;
参考文档:https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-4-autoloader.md