PSR-[0-4]
- PSR —— Proposing a Standards Recommendation
- PSR-0 (Autoloading Standard) 自动加载标准
- PSR-1 (Basic Coding Standard) 基础编码标准
- PSR-2 (Coding Style Guide) 编码风格向导
- PSR-3 (Logger Interface) 日志接口
- PSR-4 (Improved Autoloading) 自动加载的增强版,可以替换掉PSR-0了。
PSR-1
- PHP源文件必须只使用 <?php 和 <?= 这两种标签。
- 源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。
- 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
- 命名空间(namespace)和类(class) 必须遵守PSR-0标准。
- 类名(class name) 必须使用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
- 类(class)中的常量必须只由大写字母和下划线(_)组成。
- 方法名(method name) 必须使用驼峰式(cameCase)写法。
PSR-2
- 文件末尾必须空一行。
- 必须使用Unix LF(换行)作为行结束符。
- 纯PHP代码源文件的关闭标签?>必须省略。
- 缩进必须使用4个空格来缩进
- 一行推荐的是最多写80个字符
- php的关键字,必须小写,boolean值:true,false,null 也必须小写
- 命名空间
- 命名空间(namespace)的声明后面必须有一行空行。
- 所有的导入(use)声明必须放在命名空间(namespace)声明的下面。
- 一句声明中,必须只有一个导入(use)关键字。
- 在导入(use)声明代码块后面必须有一行空行。
<?php
namespace Lib\Databases; // 下面必须空格一行
use FooInterface; //use 必须在namespace 后面声明
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass; // 下面必须空格一行
class Mysql
{
}
- extends, implement 必须和 class name 写在一行,切花括号要换行写。
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{ //换行写{
}
- 属性(property)必须声明其可见性,到底是 public 还是protected还是 private,不能省略
- 方法(method) ,必须 声明其可见性,到底是 public 还是protected还是 private,不能省略。花括号{必须换行写。如果有多个参数,第一个参数后紧接, ,再加个空格,且函数name和( 之间必须要有个空格:function_name($par, $par2, $pa3), 如果参数有默认值,也要用左右空格分开
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
public getInfo($name, $age, $gender = 1) //函数名getInfo和(之间有个空格,参数之间也要有空格。默认参数也要左右都有空格
{ //必须换行写{
}
}
- 当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明 (public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面
<?php
namespace Vendor\Package;
abstract class ClassName
{
protected static $foo; //static放后面
abstract protected function zim(); //abstract放前面
final public static function bar() //final放前面,static放最后。
{
// 方法主体部分
}
}
- 函数调用
- 括号前后不要有空格
- 逗号前不要空格, 逗号后加空格
- 多行参数书写, 第一个参数需换行, 且每行一个参数 <?php bar(); $foo->bar($arg1); Foo::bar($arg2, $arg3); <?php $foo->bar( $longArgument, $longerArgument, $muchLongerArgument );
- 控制结构
<?php if ($expr1) { //左右空格 // if body } elseif ($expr2) { //elesif 连着写 // elseif body } else { // else body; }
<?php switch ($expr) { //左右空格 case 0: echo 'First case, with a break'; //对其 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
while ($expr) { //左右空格
// structure body
}
do {
// structure body; //左右空格
} while ($expr);
<?php
for ($i = 0; $i < 10; $i++) { //注意几个参数之间的空格
// for body
}
<?php
foreach ($iterable as $key => $value) { //还是空格问题
// foreach body
}
<?php
try {
// try body
} catch (FirstExceptionType $e) { //同样也是注意空格。
// catch body
} catch (OtherExceptionType $e) {
// catch body
}
-
- 闭包
- 闭包
<?php
closureWithArgs = function($arg1, $arg2) {
// body
};
closureWithArgsAndVars = function($arg1, arg2) use($var1, $var2) {
// body
};
<?php
$longArgs_noVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) {
// body
};
<?php
$noArgs_longVars = function () use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
<?php
$longArgs_longVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
<?php
$longArgs_shortVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use ($var1) {
// body
};
<?php
$shortArgs_longVars = function ($arg) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
PSR-3
- 日志接口
PSR-4
-
- autoload相关
- 此处的“类”泛指所有的class类、接口、traits可复用代码块以及其它类似结构。
- 一个完整的类名需具有以下结构:
\<命名空间>(\<子命名空间>)*\<类名> - 完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace";
- 完整的类名可以有一个或多个子命名空间;
- 完整的类名必须有一个最终的类名;
- 完整的类名中任意一部分中的下滑线都是没有特殊含义的;
- 完整的类名可以由任意大小写字母组成;
- 所有类名都必须是大小写敏感的。
- 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应;
- 紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符。
- 末尾的类名必须与对应的以 .php 为后缀的文件同名。
- 自动加载器(autoloader)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。