PHP中对PSR-1、PSR-2规范理解

PHP-FIG

在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG。就是这个联盟组织发明和创造了PSR-[0-4]规范

FIG 是 Framework Interoperability Group(框架可互用性小组)的缩写,由几位开源框架的开发者成立于
2009 年,从那开始也选取了很多其他成员进来,虽然不是 “官方” 组织,但也代表了社区中不小的一块。
项目的目的在于:通过框架作者或者框架的代表之间讨论,以最低程度的限制,制定一个协作标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了
PHP 的发展,解决这个程序设计师由来已久的困扰。

目前已表决通过了 6 套标准,已经得到大部分 PHP 框架的支持和认可。

1 基础编码规范 PSR-1
2 编码风格规范 PSR-2
3 日志接口规范 PSR-3
4 自动加载规范 PSR-4
6 缓存接口规范 PSR-6
7 HTTP 消息接口规范


基础编码规范

  1. PHP代码文件 必须<?php<?= 标签开始;
  2. PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码;
  3. PHP代码中 应该 只定义类、函数、常量等声明,或其他会产生 副作用 的操作(如:生成文件输出以及修改 .ini配置文件等),二者只能选其一;

    「副作用」(side effects) 一词的意思是,仅仅通过包含文件,不直接声明类、函数和常量等,而执行的逻辑操作。
    「副作用」包含却不仅限于:

    • 生成输出
    • 直接的 require 或 include
    • 连接外部服务
    • 修改 ini 配置
    • 抛出错误或异常
    • 修改全局或静态变量
    • 读或写文件等

    以下是一个 反例,一份包含「函数声明」以及产生「副作用」的代码:

    <?php
    // 「副作用」:修改 ini 配置
    ini_set('error_reporting', E_ALL);
    
    // 「副作用」:引入文件
    include "file.php";
    
    // 「副作用」:生成输出
    echo "<html>\n";
    
    // 声明函数
    function foo()
    {
        // 函数主体部分
    }

    下面是一个仅包含声明的示例文件;即应提倡的例子:

    <?php
    // 声明
    function foo()
    {
        // 函数体
    }
    
    // 条件式声明不算做是副作用
    if (! function_exists('bar')) {
        function bar()
        {
            // 函数体
        }
    }
  4. 命名空间以及类 必须 符合 PSR 的自动加载规范:[PSR-4]() 中的一个;
  5. 类的命名必须 遵循 StudlyCaps 大写开头的驼峰命名规范;

    类的属性命名 可以 遵循:

    • 大写开头的驼峰式 ($StudlyCaps)
    • 小写开头的驼峰式 ($camelCase)
    • 下划线分隔式 ($under_score)

    本规范不做强制要求,但无论遵循哪种命名方式,都 应该 在一定的范围内保持一致。这个范围可以是整个团队、整个包、整个类或整个方法。

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

    <?php
    namespace Vendor\Model;
    
    class Foo
    {
        const VERSION = '1.0';
        const DATE_APPROVED = '2012-06-01';
    }
  7. 方法名称 必须 符合 camelCase 式的小写开头驼峰命名规范。

编码风格规范

  1. 代码必须遵守 PSR-1。
  2. 代码必须使用4个空格来进行缩进,而不是用制表符。
  3. 一行代码的长度不建议有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少。
  4. 在命名空间(namespace)的声明下面必须有一行空行,并且在导入(use)的声明下面也必须有一行空行。
  5. 类(class)的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行。
  6. 方法(method)的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行。

    <?php
    namespace Vendor\Package;
    
    use FooInterface;
    use BarClass as Bar;
    use OtherVendor\OtherPackage\BazClass;
    
    class Foo extends Bar implements FooInterface
    {
        public function sampleFunction($a, $b = null)
        {
            if ($a === $b) {
                bar();
            } elseif ($a > $b) {
                $foo->bar($arg1);
            } else {
                BazClass::bar($arg2, $arg3);
            }
        }
    
        final public static function bar()
        {
            // 方法主体
        }
    }
  7. 所有的属性(property)和方法(method)必须有可见性声明;抽象(abstract)和终结(final)声明必须在可见性声明之前;而静态(static)声明必须在可见性声明之后。

    <?php
    namespace Vendor\Package;
    
    abstract class ClassName
    {
        protected static $foo;
    
        abstract protected function zim();
    
        final public static function bar()
        {
            // 方法主体部分
        }
    }
  8. 在控制结构关键字的后面必须有一个空格;而方法(method)和函数(function)的关键字的后面不可有空格。
  9. 控制结构的左花括号必须跟其放在同一行,右花括号必须放在该控制结构代码主体的下一行。
  10. 控制结构的左括号之后不可有空格,右括号之前也不可有空格。

    <?php
    if ($expr1) {
        // if body
    } elseif ($expr2) {
        // elseif body
    } else {
        // else body;
    }

日志接口规范

详见


自动加载规范

详见


缓存接口规范

详见


HTTP 消息接口规范

详见,暂无中文翻译

相关推荐