PHP PSR系列规范

PSR ( PHP Standard Recommendation的简写),它其实应该叫PSRs, 即系列推荐标准:目前通过的规范有PSR-0(Autoloading Standard), PSR-1(Basic Coding Standard), PSR-2(Coding Style Guide), PSR3(logger interface), PSR-4(Imporoved Autoloading)。它不是PHP官方标准,而是从Zend, Symfony2等知名PHP项目中提炼出来的一系列标准,目前有越来越多的社区项目加入成员并遵循该标准。

各个PSR规范的内容很简洁,大致如下:

PSR-0:

PSR-0即类自动加载规范(原文:官网、GitHub)。从2014-10-21日起,该规范被标记为Deprecated,由PSR-4替代。它的内容十分简洁。

  • 一个完全合格的命名空间和类名必须有以下的结构“\<Vendor Name>\(<Namespace>\)*<Class Name>”
  • 每个命名空间必须有顶级的命名空间(“Vendor Name”)
  • 每个命名空间可以有任意多个子命名空间
  • 每个命名空间在被从文件系统加载时必须被转换为“操作系统路径分隔符”(DIRECTORY_SEPARATOR )
  • 每个“_”字符在“类名”中被转换为DIRECTORY_SEPARATOR 。“_”符号在命名空间中没有明确含义
  • 符合命名标准的命名空间和类名必须以“.php”结尾来加载文件
  • Vendor Name,命名空间,类名可以由大小写字母组成,其中命名空间和类名是大小写敏感的以保证多系统兼容性

PSR-1:

PSR-1即基础编码标准(原文:官网、GitHub)。包含了类文件、类名、类方法名的命名方法。

  • 源文件必须只使用 <?php 和 <?= 这两种标签
  • 源文件中php代码的编码格式必须只使用不带BOM的UTF-8
  • 一个源文件建议只用来做声明(类,函数,常量等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置文件等),但不应该同时做这两件事
  • 命名空间和类必须遵守PSR-0标准
  • 类名使用StdudlyCaps写法( 大驼峰式 ,与caeCase区别在于,cameCase 是小驼峰,首字母小写)
  • 类中的常量必须只由大写字母和下划线(_)组成
  • 方法名必须使用cameCase写法

PSR-2:

它以PSR-1为基础,包含了缩进、每行代码长度、换行、方法可见性声明、空格和方法体大括号换行的相关规定

  • 代码必须遵守 PSR-1
  • 代码必须使用4个空格来进行缩进,而不是用制表符
  • 一行代码的长度不应有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少
  • 在命名空间的声明下面必须有一行空行,并且在use的声明下面也必须有一行空行
  • 类的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行
  • 方法的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行
  • 所有的属性和方法必须有可见性声明;abstract和final声明必须在可见性声明之前;而static声明必须在可见性声明之后
  • 在结构控制关键字的后面必须有一个空格;而方法和函数调用时后面不可有空格
  • 结构控制的左花括号必须跟其放在同一行,右花括号必须放在该结构控制代码主体的下一行
  • 控制结构的左括号之后不可有空格,右括号之前也不可有空格

PSR-3:

PSR-3是对应用日志类的通过接口的定义(原文:官网、GitHub)。内容很简单,就是一个接口,官方示例代码引用一下就好了。当然,在具体的应用中,只要遵循该接口,肯定可以定制相应的实现。

  • LoggerInterface暴露八个接口用来记录八个等级(debug, info, notice, warning, error, critical, alert, emergency)的日志
  • 第9个方法是log,接受日志等级作为第一个参数。用一个日志等级常量来调用这个方法必须和直接调用指定等级方法的结果一致。用一个本规范中未定义且不为具 体实现所知的日志等级来调用该方法必须抛出一个Psr\Log\InvalidArgumentException。不推荐使用自定义的日志等级,除非你 非常确定当前类库对其有所支持

PSR-4:

PSR-4即改进版的自动加载规范,它是PSR-0规范的接替者。它可以与任何其它的自动加载规范兼容,包括PSR-0

  • 术语「类」是一个泛称;它包含类,接口,traits 以及其他类似的结构
  • 完全限定类名应该类似如下范例:<NamespaceName>(<SubNamespaceNames>)*<ClassName>

1. 完全合规类名必须有一个顶级命名空间(Vendor Name)
2. 完全合规类名可以有多个子命名空间
3. 完全合规类名应该有一个终止类名
4. 下划线在完全合规类名中是没有特殊含义的
5. 字母在完全合规类名中可以是任何大小写的组合
6. 所有类名必须以大小写敏感的方式引用

  • 当从完全合规类名载入文件时

1.在完全合规类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录
2.在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配
3. 终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配

  • 自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值