Modern PHP 学习笔记:关于 PSR 规范

由于 PSR 规范最初来源于一个社区组织 —— PHP-FIG,因此在介绍 PSR 规范之前,先介绍一下 PHP-FIG。

PHP-FIG(PHP Framework Interop Group),是框架代表自发组织的,其成立的目标都是为了改进 PHP 社区。PHP-FIG 制定了推荐规范,PHP 框架可以自愿遵循这些规范,改进与其他框架的通信和共享功能。

PSR(PHP Standards Recommendation,PHP 推荐标准),是 PHP-FIG 制定的推荐规范。目前 PHP-FIG 一共制定并发布了五个推荐规范,本文只介绍其中的四个推荐规范(其实是 PHP-FIG 废弃了第一份推荐规范 PSR-0)。

  • PSR-1:基本的代码风格
  • PSR-2:严格的代码风格
  • PSR-3:日志记录器接口
  • PSR-4:自动加载

PSR-1:基本的代码风格

  1. PHP 标签:PHP 代码必须放在 或 标签中;
  2. 编码:所有 PHP 文件必须使用 UTF-8 字符集编码,且不存在 BOM;
  3. 目的:一个 PHP 文件可定义类、性状、函数等,或生成结果、处理数据,只能做其中一件事;
  4. 自动加载:PHP 命名空间和类必须遵守 PSR-4 自动加载器标准;
  5. 类的名称:必须一直使用驼峰式(如 CamelCase);
  6. 常量的名称:必须全部使用大写字母,可使用下划线把单词分开;
  7. 方法的名称:必须一直使用例如 camelCase 这种驼峰式。即方法名的首字母小写,后续单词的首字母大写。

PSR-2:严格的代码风格

  1. 贯彻 PSR-1 规范;
  2. 缩进:PSR-2 推荐规范要求 PHP 代码使用四个空格缩进,而非制表符缩进;
  3. 文件和代码行:必须使用 UNIX 风格的换行符(LF),最后要有一个空格,而且不能使用 PHP 关闭标签“?>”。每行代码最好不超过 80 个字符,至多不超过 120 个字符。每行末尾不应该有空格;
  4. 关键字:PSR-2 推荐规范要求,PHP 关键字应使用小写字母(如 true, false);
  5. 命名空间:每个命名空间声明与巨厚必须跟随一个空行。类似地,在一系列 use 声明语句后要加一个空行;如:
    <?php
    namespace App\Models;
     
    use App\Utilties\Sms;
    
    class MyApp
    {
        // 类定义体
    }
    
  6. 类:PSR-2 推荐规范要求,类定义体的起始花括号应在类名之后新起一行写;
  7. 方法:方法定义体的起始花括号要在方法名之后新起一行写;
  8. 可见性:类中的每个属性和方法都要声明可见性;
  9. 控制结构:所有控制结构关键字后面都要有一个空格。控制结构关键字后面的起始括号应和控制结构关键字写在同一行。控制结构关键字后面的结束括号必须单独写一行。如:
    if ("test" != "text") {
        return true;
    }
    

PSR-3:日志记录器接口

符合 PSR-3 推荐规范的 PHP 日志记录器组件,必须包含一个实现 Psr\Log\LoggerInterface 接口的 PHP 类。PSR-3 接口复用了 RFC5424 系统日志协议,规定要实现九个方法:(PHP-FIG PSR-3

<?php
namespace Psr\Log;
 
interface LoggerInterface
{
    public function emergency($message, array $content = array());
    public function alert($message, array $content = array());
    public function critical($message, array $content = array());
    public function error($message, array $content = array());
    public function warning($message, array $content = array());
    public function notice($message, array $content = array());
    public function info($message, array $content = array());
    public function debug($message, array $content = array());
    public function log($level, $message, array $content = array());
}

PSR-4:自动加载器

有了自动加载器,无需像前面使用 include() 或 require() 手动引入文件,自动加载器策略能找到 PHP 类、接口或性状,然后在运行时按需将载入 PHP 解释器。

PSR-4 自动加载器策略:

PSR-4 推荐规范不要求改变代码的实现方式,只建议如何使用文件系统目录结构和 PHP 命名空间组织代码,因此 PSR-4 自动加载器策略也是依赖 PHP 命名空间和文件系统目录结构查找并加载 PHP 类、接口和性状。

PSR-4 主要是把命名空间的前缀和文件系统中的目录对应起来。我们可以告诉 PHP,\laijingwu\Http 命名空间中的类、接口和性状在文件系统 src/ 目录下,这样 PHP 就能索引 \laijingwu\Http\Utilities 命名空间对应于 src/utilities 目录。而在 laravel 中,\App\Utilities\Sms 类则对应的是 app/utilities/Sms.php 文件。

尽管我们能够自行编写 PSR-4 自动加载器的代码,但我们完全没有必要这样做,因为我们可以直接使用依赖管理工具 Composer 自动生成的 PSR-4 自动加载器。