PHP 规范之PSR规范

更新于 2018-05-11  约 7 分钟

概述

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

参考:http://psr.phphub.org/

PSR-0 自动加载 X已废弃
PSR-1 基本代码规范
PSR-2 代码样式
PSR-3 日志接口
PSR-4 如何指定文件路径从而自动加载类定义

PSR-1基本代码规范

本篇规范制定了代码基本元素的相关标准,以确保共享的PHP代码间具有较高程度的技术互通性。

文件

  1. PHP代码文件 必须 以 <?php 或 <?= 标签开始;
  2. PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码;
  3. PHP代码中 应该 只定义类、函数、常量等声明,或其他会产生 副作用 的操作

(如:生成文件输出以及修改 .ini配置文件等),二者只能选其一;

命名空间与类

  1. 类命名 必须 遵循 StudlyCaps 大写开头的驼峰命名规范;
  2. 每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称(vendorname)
  3. 类属性:小写开头驼峰 $studlyCaps
  4. 类方法:小写开头驼峰

常量

  1. 类中的常量所有字母都 必须 大写,单词间用下划线分隔;
  2. 方法名称 必须 符合 camelCase 式的小写开头驼峰命名规范。

PSR-2编码风格规范

缩进

  1. 代码 必须 使用4个空格符而不是「Tab 键」进行缩进。

  1. 每行的字符数 应该 软性保持在 80 个之内,一定不可 多于 120 个,但 一定不可 有硬性限制。
  2. 所有PHP文件必须以一个空白行作为结束。
  3. 每行 一定不可存在多于一条语句 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须 插入一个空白行。
  4. 类的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须写在函数主体后自成一行。
  5. 方法的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。
  6. 控制结构的开始花括号({) 必须 写在声明的同一行,而结束花括号(}) 必须 写在主体后自成一行。

修饰符

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

空格

  1. 类方法参数每个逗号后面必须要有一个空格,而逗号前面 一定不可 有空格
  2. 控制结构的开始左括号后和结束右括号前,都 一定不可 有空格符。

关键字

  1. 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不可有。
  2. PHP所有 关键字 必须 全部小写,常量 true 、false 和 null 也 必须 全部小写。

PSR-3日志接口规范

  1. LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。
  2. 第九个方法 —— log,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须 与直接调用以上八个方法具有相同的效果。
  3. 如果传入的等级常量参数没有预先定义,则 必须 抛出PsrLogInvalidArgumentException 类型的异常。在不确定的情况下,使用者 不该 使用未支持的等级常量来调用此方法。
/**

 * 日志等级常量定义

 */

class LogLevel

{

    constEMERGENCY='emergency';

    constALERT     ='alert';

    constCRITICAL  ='critical';

    constERROR     ='error';

    constWARNING   ='warning';

    constNOTICE    ='notice';

    constINFO      ='info';

    constDEBUG     ='debug';

}

PSR-4自动加载规范

类似如下范例:<NamespaceName>(<SubNamespaceNames>)*<ClassName>

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

一些实际商用项目中使用的规范

控制层

  1. 不出现sql语句(sql封装到模型层然后作为方法调用)
  2. sql语句、3行以上逻辑代码空行
  3. 上下文关系函数或方法间不空行
  4. bool使用if(true === $name)的形式
  5. 使用双引号链接变量
  6. 注意隐式转换
  7. 使用全局变量需要注释其含义,取值范围:

clipboard.png

8 函数头部如下注释:

clipboard.png

或者

clipboard.png

9 注释间空行:

clipboard.png

10 文件头部注释:

clipboard.png

或者

clipboard.png

11 switch语句的case跳转需要注释

12 标记变量的命名:

clipboard.png

13 接口的命名前缀

clipboard.png

14 状态码尽量使用常量,而不是难以理解的数字

clipboard.png

15 类文件名使用首大写驼峰方式,普通文件名使用下划线方式

16 配置里的变量名使用下划线方式

阅读 1.9k更新于 2018-05-11

推荐阅读
PHPer进阶之路
用户专栏

共同阐述与了解 phper各阶段需要掌握、学习的技术、技能、能力

26 人关注
11 篇文章
专栏主页
目录