PHP PSR系列编码规范(摘要)

目录

PSR-1 基本代码规范(摘要)

PSR-2 代码风格规范(摘要)

PSR-3 日志接口规范(摘要)

PSR-4 自动载入(摘要)


PSR-1 基本代码规范(摘要)

PHP代码文件必须以 <?php 或 <?= 标签开始,不可使用其它自定义标签。

PHP代码文件必须以 不带BOM的 UTF-8 编码。

PHP代码里不应该将类的定义、函数声明、常量声明 和 有副作用的代码(例如修改.ini配置文件、引入文件、生成输出、连接外部服务、方法等)混在一起,应该分离【例如保存在不同文件中】。

类的命名必须遵循大写开头的驼峰命名规范,每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称(vendor name)。

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

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

PSR-2 代码风格规范(摘要)

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

代码必须使用4个空格符而不是 tab键 进行缩进。

每行的字符数应该软性保持在80个之内, 理论上一定不可多于120个, 但一定不能有硬性限制。

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

类和方法的开始花括号{和结束花括号}都自占一行。

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

不要使用下划线作为前缀,来区分属性是 protected 或 private。

控制结构【如if】的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有。

控制结构的开始花括号{必须写在声明的同一行,而结束花括号}必须写在主体后自成一行。

控制结构的开始左括号后和结束右括号前,都一定不能有空格符。

结构体主体一定要有一次缩进。

每个结构体的主体都必须被包含在成对的花括号之中, 这能让结构体更加结构化,以及减少加入新行时,出错的可能性。

应该使用关键词 elseif 代替所有 else if ,以使得所有的控制关键字都像是单独的一个词。

switch 结构如果存在非空的 case 直穿语句,主体里必须有类似 // no break 的注释。

代码示例:

<?php
switch ($expr) {
    case 0:
        echo 'First case, with a break';
        break;
    case 1:
        echo 'Second case, which falls through';
        // no break
    case 2:
    case 3:
    case 4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}
//此处保留一空行

所有PHP文件必须以一个空白行作为结束。

纯PHP代码文件必须省略最后的 ?> 结束标签。

方法及函数调用时,方法名或函数名与参数左括号之间一定不能有空格,参数左括号后和右括号前一定不能有空格。

参数列表中,每个参数后面必须要有一个空格,而前面一定不能有空格。

参数可以分列成多行,此时包括第一个参数在内的每个参数都必须单独成行。

有默认值的参数,必须放到参数列表的末尾。

非空行后一定不能有多余的空格符。

空行可以使得阅读代码更加方便以及有助于代码的分块。

每行一定不能存在多于一条语句。

每条语句一定不可定义超过一个属性。

PHP所有 关键字必须全部小写。

常量 true 、false 和 null 也必须全部小写。

代码示例:

<?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 functionbar()
    {
        // method body
    }
}
//此处保留一空行

备注: 使用空格而不是tab键缩进的好处在于, 避免在比较代码差异、打补丁、重阅代码以及注释时产生混淆。 并且,使用空格缩进,让对齐变得更方便。

PSR-3 日志接口规范(摘要)

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

第九个方法 —— log,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,则必须抛出 Psr\Log\InvalidArgumentException 类型的异常。在不确定的情况下,使用者不该使用未支持的等级常量来调用此方法。

以上每个方法都接受一个字符串类型或者是有 __toString() 方法的对象作为记录信息参数,这样,实现者就能把它当成字符串来处理,否则实现者必须自己把它转换成字符串。

记录信息参数可以携带占位符,实现者可以根据上下文将其它替换成相应的值。

其中占位符必须与上下文数组中的键名保持一致。

占位符的名称必须由一个左花括号 { 以及一个右括号 } 包含。但花括号与名称之间一定不能有空格符。

占位符的名称应该只由 A-Z、 a-z,0-9、下划线 _、以及英文的句号 .组成,其它字符作为将来占位符规范的保留。

实现者可以通过对占位符采用不同的转义和转换策略,来生成最终的日志。 而使用者在不知道上下文的前提下,不该提前转义占位符。

占位符使用示例:

/** * 用上下文信息替换记录信息中的占位符 */
function interpolate($message, array $context = array()){
    // 构建一个花括号包含的键名的替换数组
    $replace = array();
    foreach ($context as $key => $val) {
        $replace['{' . $key . '}'] = $val;
    }

    // 替换记录信息中的占位符,最后返回修改后的记录信息。
    return strtr($message, $replace);
}

// 含有带花括号占位符的记录信息。
$message = "User {username} created";

// 带有替换信息的上下文数组,键名为占位符名称,键值为替换值。
$context = array('username' => 'bolivar');

// 输出 "User bolivar created"
echo interpolate($message, $context);

PSR-4 自动载入(摘要)

一个完整的类名需具有以下结构:

 \<命名空间>(\<子命名空间>)*\<类名>

完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace"。

完整的类名可以有一个或多个子命名空间。

完整的类名必须有一个最终的类名。

完整的类名中任意一部分中的下滑线都是没有特殊含义的。

完整的类名可以由任意大小写字母组成。

所有类名都必须是大小写敏感的。

当根据完整的类名载入相应的文件。

完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应。

末尾的类名必须与对应的以 .php 为后缀的文件同名。

自动加载器(autoloader)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值