PSR
是PHP Standard Recommendations
的简写,由PHP FIG
组织制定的PHP
规范,是PHP
开发的实践标准。
详细请看: PHP 标准规范
PSR-1
基本代码规范
PHP
代码文件必须以<?php
或<?=
标签开始;PHP
代码文件必须以不带BOM的UTF-8
编码;PHP
代码中应该只定义类、函数、常量等声明,或其他惠产生副作用
的操作(如:生成文件输出以及修改php.ini
配置文件等)二者只能选其一;- 命令空间以及类必须符合
PSR
的自动加载规范: [PSR-4]中的一个; - 类的命名必须遵循
StudlyCaps
大写开头的驼峰命名规范; - 类中的常量所有字母都必须大写,单词间用下划线分隔;
- 方法名称必须符合
camelCase
式的小写开头驼峰命名规范;
类的属性命名可以遵循
- 大写开头的驼峰式(
$StudlyCaps
)- 小写开头的驼峰式(
$camelCase
)- 下划线分隔式(
$under_score
)
PSR-2
编码风格规范
- 代码必须遵循[PSR]中的编码规范;
- 代码必须使用
4
个空格符而不是[Tab键]进行缩进; - 每行的字符数应该软性保持在80个之内,理论上一定不可多于120个,但一定不可有硬性限制;
- 每个
namespace
命名空间声明语句和use
声明语句块后面,必须插入一个空白行; - 类的开始花括号
{
必须写在函数声明后自成一行,结束花括号}
也必须写在函数主题后自成一行; - 方法的开始花括号
{
必须写在函数声明后自成一行,结束花括号}
也必须写在函数主题后自成一行; - 类的属性和方法必须添加访问修饰符(
private
、protected
以及public
),abstract
以及final
必须声明在访问修饰符之前, 而static
必须声明在访问修饰符之后; - 控制结构的关键字后必须要有一个空格符, 而调用方法或函数时则一定不可有;
- 控制结构的开始花括号
{
必须写在声明的同一行,而结束的花括号}
必须写在主体后自成一行; - 控制结构的开始左括号后和结束右括号前,都一定不可有空格符
PSR-3
日志接口规范
本规范的主要目的,是为了让日志类库以简单通用的方式,通过接收一个 Psr\Log\LoggerInterface
对象,来记录日志信息。
LoggerInterface
接口对外定义了八个方法,分别用来记录RFC 5424
中定义的八个等级的日志:debug
info
notice
warning
error
critical
alert
emergency
第九个方法 ——
log
,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,
必须 与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,
则 必须 抛出Psr\Log\InvalidArgumentException
类型的异常。
在不确定的情况下,使用者 不该 使用未支持的等级常量来调用此方法。
PSR-4
自动加载规范
此处的[类]泛指所有的[Class类]、[接口]、[traits可复用代码块]以及其他类似结构;
一个玩转的类名需具有以下结构
<命名空间>(<子命名空间>)*<类名>
- 完整的类名 必须 要有一个顶级命名空间,被称为
"vendor namespace"
; - 完整的类名 可以 有一个或多个子命名空间;
- 完整的类名 必须 有一个最终的类名;
- 完整的类名中任意一部分中的下滑线都是没有特殊含义的;
- 完整的类名 可以 由任意大小写字母组成;
- 所有类名都 必须 是大小写敏感的;
- 完整的类名 必须 要有一个顶级命名空间,被称为
当根据完整的类名载入相应的文件
- 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为「命名空间前缀」,其必须与至少一个「文件基目录」相对应;
- 紧接命名空间前缀后的子命名空间 必须 与相应的「文件基目录」相匹配,其中的命名空间分隔符将作为目录分隔符
- 末尾的类名 必须 与对应的以
.php
为后缀的文件同名; - 自动加载器(
autoloader
)的实现 一定不可 抛出异常、一定不可 触发任一级别的错误信息以及 不应该 有返回值。
PSR-6
缓存接口规范
调用类库(Calling Library) - 调用者, 使用缓存服务的类库,这个类库调用缓存服务,
调用的是此缓存接口规范的具体「实现类库」,调用者不需要知道任何「缓存服务」的具体实现。实现类库 (Implementing Library) - 此类库是对「缓存接口规范」的具体实现,封装起来的缓存服务,供「调用类库」使用。实现类库 必须 提供
PHP
类来实现Cache\CacheItemPoolInterface
和Cache\CacheItemInterface
接口。
实现类库必须
支持最小的如下描述的TTL
功能, 秒级别的精准度.生存时间值 (TTL - Time To Live) - 定义了缓存可以存活的时间,以秒为单位的整数值。
过期时间 (Expiration) - 定义准确的过期时间点,一般为缓存存储发生的时间点加上 TTL 时间值,也可以指定一个
DateTime
对象。键 (KEY) - 长度大于 1 的字串,用作缓存项在缓存系统里的唯一标识符
命中 (Hit) - 一个缓存的命中,指的是当调用类库使用「键」在请求一个缓存项的时候,在缓存池里能找到对应的缓存项,并且此缓存项还未过期,并且此数据不会因为任何原因出现错误
未命中 (Miss) - 一个缓存未命中,是完全的上面描述的「命中」的相反
延迟 (Deferred) - 一个延迟的缓存,指的是这个缓存项可能不会立刻被存储到物理缓存池里。
数据
实现类库 必须 支持所有的可序列化的
PHP
数据类型,包含:
- 字符串 - 任何大小的PHP兼容字符串
- 整数 - PHP支持的低于64位的有符号整数值
- 浮点数 - 所有的有符号浮点数
- 布尔 -
true
和false
- Null -
null
值 - 数组 - 各种形式的PHP数组
- 对象(Object) - 所有的支持无损序列化和反序列化的对象
PSR-7
HTTP 消息接口规范
HTTP
消息是 Web
技术发展的基础。浏览器或 HTTP
客户端如 curl
生成发送 HTTP
请求消息到 Web
服务器,Web
服务器响应 HTTP
请求。
服务端的代码接受 HTTP
请求消息后返回 HTTP 响应消息。
消息
一个 HTTP 消息,指定是一个从客户端发往服务器端的请求,或者是服务器端返回客户端的响应。对应的两 个消息接口:
Psr\Http\Message\RequestInterface
Psr\Http\Message\ResponseInterface
HTTP 头信息
大小写不敏感的字段名字
HTTP
消息包含大小写不敏感头信息。使用 MessageInterface
接口来设置和获取头信息,大小写 不敏感的定义在于,
如果你设置了一个 Foo
的头信息,foo
的值会被重写,你也可以通过 foo
来 拿到 FOO
头对应的值。
对应多条数组的头信息
为了适用一个 HTTP
「键」可以对应多条数据的情况,我们使用字符串配合数组来实现,
你可以从一个 MessageInterface
取出数组或字符串,使用 getHeaderLine($name)
方法可以获取通过逗号分割的不区分大小写的字符串形式的所有值。
也可以通过 getHeader($name)
获取数组形式头信息的所有值。
注意:并不是所有的头信息都可以适用逗号分割(例如
Set-Cookie
),当处理这种头信息时候,MessageInterace
的继承类 应该 使用getHeader($name)
方法来获取这种多值的情况
主机信息
在请求中,Host
头信息通常和 URI 的 host
信息,还有建立起 TCP 连接使用的 Host
信息一致。 然而,HTTP 标准规范允许主机 host
信息与其他两个不一样。