目录
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)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。