PSR规范标准

参考文档: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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>