PHP PSR 代码规范基本介绍

  • 2018-12-26 13:45:27
  • Sun Xiaozhi
  • 338

PSR是PHP Standard Recommendation的简写,即PHP推荐标准。

目前通过的规范有

PSR-0(Autoloading Standard)
PSR-1(Basic Coding Standard)
PSR-2(Coding Style Guide)
PSR-3(Logger Interface)
PSR-4(Improved Autoloading)

PSR不是PHP官方标准,而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准,目前有越来越多的社区项目加入并遵循该标准。

PHP FIG(Framework Interoperability Group)框架可互用性小组是制定PSR开发规范的组织。他们的目的在于以最低程度的限制制定一个统一的标准,让各个框架遵循统一的编码规范。

PSR-0(自动加载规范)

PSR-0(Autoloading Standard)类自动加载规范,该规范现已废弃(Deprecated),它将由PSR-4替代。

  • 一个完全合格的命名空间和类名必须遵循以下结构 “\VendorName\Namespace\ClassName”

  • 每个命名空间必须有顶级的命名空间”VendorName”

  • 每个命名空间可以有任意多个子命名空间

  • 每个命名空间在被文件系统加载时必须被转换为操作系统路径分隔符 (DIRECTORY_SEPARATOR)

  • 每个”_”字符在”类名”中被转换为DIRECTORY_SEPARATOR。而在 PSR-4 中使用下划线没有任何特殊含义

  • 符合命名标准的命名空间和类名必须以”.php”结尾来加载文件

  • 命名空间和类名可以由大小写字母组成,但必须对大小写敏感以保证多系统兼容性

PSR-1(基本代码规范)

PSR-1(Basic Coding Standard)基本代码规范,用以确保共享的PHP代码间具有较高程度的技术互通性。

  • PHP代码源文件必须以 <?php 或 <?= 标签开始

  • PHP代码源文件必须使用不带 BOM 的 UTF-8 编码

  • 一个源文件建议只用作定义类、函数、常量等声明,或者其他产生从属效应的操作(如:输出信息,修改配置文件等)

  • 命名空间以及类必须符合 PSR 的自动加载规范:PSR-0 或 PSR-4

  • 类的命名必须遵循 StudlyCaps 大写开头的驼峰式命名规范

  • 类中的常量所有字母都必须大写,单词间用下划线分隔

  • 方法名必须符合 camelCase 式的小写开头驼峰式命名规范

    • BOM(byte order mark)是 Unicode 标准的一部分,通常用于标记纯文本字节序(byte order),使得文本处理程序能够识别读入的文件使用的 Unicode 编码(UTF-8、UTF-16、UTF-32)。

    • 从属效应是指仅仅通过包含文件,不直接声明类、函数和常量而执行的逻辑操作。一份PHP源文件应该要么就只包含不产生从属效应的定义操作,要么就包含只会产生从属效应的逻辑操作,切勿同时包含两者。

PSR-2(代码风格规范)

PSR-2(Coding Style Guide)代码风格规范,通过制定一系列规范化PHP代码的规则,以减少因代作者码风格不同而造成的阅读不便。

  • 代码必须遵循 PSR-1 中的编码规范

  • 代码必须使用4个空格来进行缩进,而非制表符(TAB)

  • 建议每行代码字符数保持在80个以内,理论上不可多于120个,但不做硬性限制

  • 每个 namespace 命名空间语句和use声明语句块后面必须插入一个空白行

  • 类的左花括号 “{” 必须写在声明后自成一行,右花括号 “}”也必须在类主体下自成一行

  • 方法的左花括号 “{” 必须放在声明后自成一行,右花括号 “}” 也必须于主体下自成一行

  • 类的属性和方法必须添加访问修饰符(private、protected、public),abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符之后(例:final public static)

  • 在控制结构关键字的后面必须有一个空格,而调用方法或函数时一定不能有(控制结构:if-else、switch-case、try-catch、while、foreach …)

  • 控制结构的左花括号 “{” 必须跟其处于同一行,右花括号 “}” 必须在控制结构主体之后自成一行

  • 控制结构的开始左括号之后,和结束右括号之前都不可以有空格

PSR-3(日志接口规范)

PSR-3(Logger Interface)日志接口规范,主要目的是为了让日志类库通过接收一个 LoggerInterface 对象来记录日志信息。

  • LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、info、notice、warning、error、critical、alert、emergency

  • 第九个方法 log(),第一个参数为记录等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须与直接调用以上八个方法具有相同的效果。如果传入的等级常量没有预先定义,则必须抛出 psr\Log\InvalidArgumentException 类型的异常。不推荐使用自定义的日志等级,除非你非常确定当前类库对其有所支持。

PSR-4(自动加载优化规范)

PSR-4(Improved Autoloading)本规范是关于自动载入对应类的相关规范,是 PSR-0 自动加载规范的补充。

  • 此处的“类”是一个泛称,它包含类、接口、traits 以及其他类似的结构

  • 完全限定类名需要遵循以下结构:<命名空间>(<子命名空间>)*<类名>

    • 完全限定类名必须要有一个顶级命名空间,被称为 “vendor namespace”;

    • 完全限定类名可以有一个或多个子命名空间;

    • 完全限定类名必须有一个终止类名;

    • 完全限定类名中任意一部分中的下划线都没有特殊含义;

    • 完全限定类名可以由任意大小写字母组成;

    • 完全限定类名必须以大小写敏感的方式引用;

  • 当根据完整的类名载入相应的文件时:

    • 完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录;

    • 紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符;

    • 终止类名对应一个以 .php结尾的文件,文件名必须和终止类名大小写匹配;

  • 自动加载器(autoloader)的实现不能抛出异常,不可引发任一级别错误,也不应该有返回值