PSR规范
PSR前言
- FIG组织制定PHP相关规范,PSR目的通过代码共同点找出一个协作编程的方法
psr0(官方已废弃)
使用自动加载遵守的规范
- 每个命名空间必须有一个顶级空间名
- 加载源文件,空间名分割符被转成DIRECTORY_SEPARATOR
- 类名每个下划线被转成DIRECTORY_SEPARATOR
- 标准的命名空间加载源文件以 .php 后缀
- 空间名、类名以大小写字母组合而成
namespacepackageClass_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
namespacepackage_nameClass_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
PSR-1
基础编码规范
- 源文件编码格式必须不带BOM的UTF8
- 缩进4个空格
- 类的声明括号({})单独一行,方法也是
- 方法参数之间要有逗号和空格
- 类中方法和属性带可以见(public,private,protect)
- 类名用驼峰式(StudlyCaps)大写开头
- 方法名称 必须 符合 camelCase 式的小写开头驼峰命名规范
- 类常量必须只由大写字母和下划线(_)组成
- 代码必须只使用长标签()或短标签树人初(<?=? >)
- 空间名和类名遵守psr0规范
- 方法名必须使用camelCase()风格声明
- 控制结构 if else switch case while for foreach.... 控制结构关键字与括号要有一个空格,开始的圆括号后面及结束的圆括号前面不能有空格。起始花括号与关键字在一行上
副作用:
定义:仅仅通过包含文件,不直接声明类、函数和常量等,而执行的逻辑操作
产生输出 直接require或include,连接外部服务,修改ini配置,触发错误或异常,修改全局或者静态变量,读取或修改文件等等
PSR-2
编码风格规范,减少因代码风格不同而造成不便
- 遵守PSR-1编码规范
- 每行 不该 多于80个字符,大于80字符的行 应该 折成多行
- 每行 一定不可 存在多于一条语句
- final 必须声明在修饰符前
- static 必须在修饰符后
- true false 和null 必须全部小写,关键字全部小写
- namespace 声明后插入一个空白行
- use声明句块后必须插入一个空白行
- 关键词 extends 和 implements必须写在类名称的同一行
- implements 的继承列表也可以分成多行
- 方法参数列表中,每个逗号后面必须有一个空格
- switch case 如果存在非空case直穿语句
<?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()
{
// method body
}
}
<?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;
}
- 闭包声明时,关键词 function 后以及关键词 use 的前后都必须要有一个空格
- 开始花括号必须写在声明的同一行,结束花括号必须紧跟主体结束的下一行
- 参数列表逗号后必须有空格
- 闭包有默认值参数必须放到最后
<?php
$closureWithArgs = function ($arg1, $arg2) {
// body
};
$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
// body
};
PSR-3
日志类库通用接口规范
PSR-4
升级版的PSR-0自动加载规范
- 下划线不存在实际意义
- 类名必须大小写敏感
- autoloader的实现一定不能抛出异常,不能有任何级别的错误以及不应该有返回值
- 类名必须以.php为后缀
- 子命名空间必须与相应文件目录匹配,命名空间分隔符作为目录分隔符
psr-0和psr4对比
定义
Foo\Bar => vendor\foo\bar\src
使用
use Foo\Bar\Tool\Request
PSR-0实际目录 vendor\foo\bar\src\Foo\Bar\Tool\Request.php
PSR-4实际目录 vendor\foo\bar\src\Tool\Request.php
PSR-6
缓存接口规范
- 缓存一定不可作为应用程序不可获取核心功能
- 缓存错误一定不可导致应用程序故障,捕捉底层存储驱动抛出异常
- 延迟:缓存项可能不会理解被存储到物理缓存池,所有延迟缓存都必须做持久化
- 命中 请求一个缓存项时,在缓存池能找到对应缓存项,保证不会因任何原因出现错误,确保验证isHit()才调用get()获取数据
PSR-7
HTTP消息传递接口
- HTTP信息包含大小写不明感头信息(接口实现类必须大小写敏感)
请求方法 目标地址 HTTP协议
POST /path HTTP/1.1
目的主机 空一行消息内容
Host: example.com
foo=bar&baz=bat
HTTP协议 状态么 描述文本
HTTP/1.1 200 OK
内容类型 空一行消息内容
Content-Type: text/plain
foo=bar&baz=bat
https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md