php设计模式--面向对象编程规范PSR
php业界提出大家要遵循的面向对象编码规范,下面一一列出。
PSR-0:
1.命名空间必须与绝对路径一致
2.类的首字母必须大写
3.出入口文件外,其他‘.php’必须只有一个类
PSR-1:基础编码规范
1.PHP代码文件 必须 以 或 标签开始;
2.PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码;
3.PHP代码中 应该 只定义类、函数、常量等声明,或其他会产生 副作用 的操作(如:生成文件输出以及修改 .ini 配置文件等),二者只能选其一;
副作用包含生成输出,直接的require或include,连接外部服务,修改ini配置,抛出错误或异常,修改全局或静态变量,读或写文件等。
(1)一份包含「函数声明」以及产生「副作用」的代码(非范式):
<?php // 「副作用」:修改 ini 配置 ini_set('error_reporting', E_ALL); // 「副作用」:引入文件 include "file.php"; // 「副作用」:生成输出 echo "<html>\n"; // 声明函数 function foo() { // 函数主体部分 }
(2)一份只包含声明不产生「副作用」的代码)(范式):
<?php // 声明函数 function foo() { //content } // 条件声明 此不为「副作用」 if (! function_exists('bar'))
{ function bar() { //content } }
4.命名空间以及类 必须 符合 PSR 的自动加载规范.
命名空间以及类的命名必须遵循 PSR-4
根据规范,每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称(vendor name)。
类的命名必须遵循 SxxxUxxx 大写开头的驼峰命名规范。
5.类中的“常量”所有字母都 必须 大写,单词间用下划线分隔。
6.方法名称 必须 符合 sxxxUxxx 式的小写开头驼峰命名规范
PSR-2:编码风格规范
1.代码 必须 遵循 PSR-1 中的编码规范 。
2.代码 必须 使用4个空格符而不是「Tab 键」进行缩进。
3.每行的字符数 应该 软性保持在 80 个之内,理论上 一定不可 多于 120 个,但 一定不可 有硬性限制。
4.每个 namespace 命名空间声明语句和 use 声明语句块后面,必须 插入一个空白行。
5.类的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。
6.方法的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。
7.类的属性和方法 必须 添加访问修饰符(private、protected 以及 public),abstract 以及 final 必须 声明在访问修饰符之前,而 static 必须 声明在访问修饰符之后。
8.控制结构的关键字后 必须 要有一个空格符,而调用方法或函数时则 一定不可 有。
9.控制结构的开始花括号({) 必须 写在声明的同一行,而结束花括号(}) 必须 写在主体后自成一行。
10.控制结构的开始左括号后和结束右括号前,都 一定不可 有空格符。
PSR-3:日志接口规范
1.LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency
2.第九个方法 —— log,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,则必须抛出 Psr\Log\InvalidArgumentException 类型的异常。在不确定的情况下,使用者不该使用未支持的等级常量来调用此方法。
PSR-4:自动加载规范(对PSR-0的补充)
1.PSR-0规范
2.一个完整的类名需具有以下结构:
\<命名空间>(\<子命名空间>)*\<类名>
完整的类名 必须 要有一个顶级命名空间,被称为 “vendor namespace”;
完整的类名 可以 有一个或多个子命名空间;
完整的类名 必须 有一个最终的类名;
完整的类名中任意一部分中的下滑线都是没有特殊含义的;
完整的类名 可以 由任意大小写字母组成;
所有类名都 必须 是大小写敏感的。
3.当根据完整的类名载入相应的文件
完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为「命名空间前缀」,其必须与至少一个「文件基目录」相对应。
紧接命名空间前缀后的子命名空间 必须 与相应的「文件基目录」相匹配,其中的命名空间分隔符将作为目录分隔符。
末尾的类名 必须 与对应的以 .php 为后缀的文件同名。
自动加载器(autoloader)的实现 一定不可 抛出异常、一定不可 触发任一级别的错误信息以及 不应该 有返回值。
PSR-6:缓存接口规范
-
调用类库 (Calling Library) - 调用者,使用缓存服务的类库,这个类库调用缓存服务,调用的 是此缓存接口规范的具体「实现类库」,调用者不需要知道任何「缓存服务」的具体实现。
-
实现类库 (Implementing Library) - 此类库是对「缓存接口规范」的具体实现,封装起来的缓存服务,供「调用类库」使用。实现类库 必须 提供 PHP 类来实现
Cache\CacheItemPoolInterface
和Cache\CacheItemInterface
接口。 实现类库 必须 支持最小的如下描述的 TTL 功能,秒级别的精准度。 -
生存时间值 (TTL - Time To Live) - 定义了缓存可以存活的时间,以秒为单位的整数值。
-
过期时间 (Expiration) - 定义准确的过期时间点,一般为缓存存储发生的时间点加上 TTL 时 间值,也可以指定一个 DateTime 对象。
假如一个缓存项的 TTL 设置为 300 秒,保存于 1:30:00 ,那么缓存项的过期时间为 1:35:00。
实现类库 可以 让缓存项提前过期,但是 必须 在到达过期时间时立即把缓存项标示为 过期。如果调用类库在保存一个缓存项的时候未设置「过期时间」、或者设置了
null
作为过期 时间(或者 TTL 设置为null
),实现类库 可以 使用默认自行配置的一个时间。如果没 有默认时间,实现类库 必须把存储时间当做永久性
存储,或者按照底层驱动能支持的 最长时间作为保持时间。 -
键 (KEY) - 长度大于 1 的字串,用作缓存项在缓存系统里的唯一标识符。实现类库 必须 支持「键」规则
A-Z
,a-z
,0-9
,_
, 和.
任何顺序的 UTF-8 编码,长度 小于 64 位。实现类库 可以 支持更多的编码或者更长的长度,不过 必须 支持至少以上指定 的编码和长度。实现类库可自行实现对「键」的转义,但是 必须 保证能够无损的返回「键」字串。以下 的字串作为系统保留:{}()/\@:
,一定不可 作为「键」的命名支持。 -
命中 (Hit) - 一个缓存的命中,指的是当调用类库使用「键」在请求一个缓存项的时候,在缓存 池里能找到对应的缓存项,并且此缓存项还未过期,并且此数据不会因为任何原因出现错误。调用类 库 应该 确保先验证下
isHit()
有命中后才调用get()
获取数据。 -
未命中 (Miss) - 一个缓存未命中,是完全的上面描述的「命中」的相反。指的是当调用类库使用「键」在请求一个缓存项的时候,在缓存池里未能找到对应的缓存项,或者此缓存项已经过期,或者此数据因为任何原因出现错误。一个过期的缓存项,必须 被当做
未命中
来对待。 -
延迟 (Deferred) - 一个延迟的缓存,指的是这个缓存项可能不会立刻被存储到物理缓存池里。一个 缓存池对象 可以 对一个指定延迟的缓存项进行延迟存储,这样做的好处是可以利用一些缓存服务器提供 的批量插入功能。缓存池 必须 能对所有延迟缓存最终能持久化,并且不会丢失。可以 在调用类库还未发起保存请求之前就做持久化。当调用类库调用
commit()
方法时,所有的延迟缓存都 必须 做持久化。实现类库 可以 自行决定使用什么逻辑来触发数据持久化,如对象的析构方法 (destructor)
内、调用save()
时持久化、倒计时保存或者触及最大数量时保存等。当请求一个延迟 缓存项时,必须 返回一个延迟,未持久化的缓存项对象。
PSR-7:HTTP接口规范
RFC 7230 和 RFC 7231 HTTP 消息传递的接口,还有 RFC 3986 里对 HTTP 消息的 URIs 使用。
HTTP 消息是 Web 技术发展的基础。浏览器或 HTTP 客户端如 curl
生成发送 HTTP 请求消息到 Web 服务器,Web 服务器响应 HTTP 请求。服务端的代码接受 HTTP 请求消息后返回 HTTP 响应消息。
通常 HTTP 消息对于终端用户来说是不可见的,但是作为 Web 开发者,我们需要知道 HTTP 机制,如何发起、构建、取用还有操纵 HTTP 消息,知道这些原理,以助我们刚好的完成开发任务,无论这个任务是发起一个 HTTP 请求,或者处理传入的请求。