PSR

是PHP Standard Recommendation的简写,它其实应该叫PSRs,即系列推荐标准:目前通过的规范有PSR-0(Autoloading Standard)、PSR-1(Basic Coding Standard)、PSR-2(Coding Style Guide)、PSR-3(Logger Interface)、PSR-4(Improved Autoloading)。它不是PHP官方标准,而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准,目前有越来有多的社区项目加入成员并遵循该标准。

PHP-FIG — PHP Framework Interoperability Group, 是制定PSRs开发规范的组织,它的成员由很多知名PHP社区项目组成,在其官网首页下方可以看到成员清单。这些成员制定规范,并且落实在自己的项目中。

其实各个PSR规范的内容都很简洁明了,比起那些动则几十页的规范,真是好太多了。

PSR-0(Autoloading Standard)

PSR-0即类自动加载规范(原文:官网GitHub)。从2014-10-21日起,该规范被标记为Deprecated,由PSR-4替代。它的内容十分简洁。

内容:

  1. 一个完全合格的命名空间和类名必须有以下的结构“\<Vendor Name>\(<Namespace>\)*<Class Name>”
  2. 每个命名空间必须有顶级的命名空间(“Vendor Name”)
  3. 每个命名空间可以有任意多个子命名空间
  4. 每个命名空间在被从文件系统加载时必须被转换为“操作系统路径分隔符”(DIRECTORY_SEPARATOR )
  5. 每个“_”字符在“类名”中被转换为DIRECTORY_SEPARATOR 。“_”符号在命名空间中没有明确含义
  6. 符合命名标准的命名空间和类名必须以“.php”结尾来加载文件
  7. Vendor Name,命名空间,类名可以由大小写字母组成,其中命名空间和类名是大小写敏感的以保证多系统兼容性

PSR-1(Basic Coding Standard)

PSR-1即基础编码标准(原文:官网GitHub)。内容也是否简洁,包含了类文件、类名、类方法名的命名方法。

内容:

  1. 源文件必须只使用 <?php 和 <?= 这两种标签

  2. 源文件中php代码的编码格式必须只使用不带BOM的UTF-8

  3. 一个源文件建议只用来做声明(类,函数,常量等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置文件等),但不应该同时做这两件事

  4. 命名空间和类必须遵守PSR-0标准

  5. 类名必须使用StudlyCaps写法

  6. 类中的常量必须只由大写字母和下划线(_)组成

  7. 方法名必须使用cameCase写法

PSR-2(Coding Style Guide)

PSR-2即编码风格标准(原文:官网GitHub)。内容就稍多,但还是比较简洁,它以PSR-1为基础,包含了缩进、每行代码长度、换行、方法可见性声明、空格和方法体大括号换行的相关规定。

标准内容:

  1. 代码必须遵守 PSR-1

  2. 代码必须使用4个空格来进行缩进,而不是用制表符

  3. 一行代码的长度不应有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少

  4. 在命名空间的声明下面必须有一行空行,并且在use的声明下面也必须有一行空行

  5. 类的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行

  6. 方法的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行

  7. 所有的属性和方法必须有可见性声明;abstract和final声明必须在可见性声明之前;而static声明必须在可见性声明之后

  8. 在结构控制关键字的后面必须有一个空格;而方法和函数调用时后面不可有空格

  9. 结构控制的左花括号必须跟其放在同一行,右花括号必须放在该结构控制代码主体的下一行

  10. 控制结构的左括号之后不可有空格,右括号之前也不可有空格

PSR-3(Logger Interface)

PSR-3是对应用日志类的通过接口的定义(原文:官网GitHub)。内容很简单,就是一个接口,官方示例代码引用一下就好了。当然,在具体的应用中,只要遵循该接口,肯定可以定制相应的实现。

基础内容:

  1. LoggerInterface暴露八个接口用来记录八个等级(debug, info, notice, warning, error, critical, alert, emergency)的日志。

  2. 第 九个方法是log,接受日志等级作为第一个参数。用一个日志等级常量来调用这个方法必须和直接调用指定等级方法的结果一致。用一个本规范中未定义且不为具 体实现所知的日志等级来调用该方法必须抛出一个Psr\Log\InvalidArgumentException。不推荐使用自定义的日志等级,除非你 非常确定当前类库对其有所支持。

PSR-4(Improved Autoloading)

PSR-4即改进版的自动加载规范(原文:官网GitHub)。它是PSR-0规范的接替者。它可以与任何其它的自动加载规范兼容,包括PSR-0。

内容:

  1. 术语「类」是一个泛称;它包含类,接口,traits 以及其他类似的结构;
  2. 完全限定类名应该类似如下范例:<NamespaceName>(<SubNamespaceNames>)*<ClassName>
    1. 完全限定类名必须有一个顶级命名空间(Vendor Name)

    2. 完全限定类名可以有多个子命名空间

    3. 完全限定类名应该有一个终止类名

    4. 下划线在完全限定类名中是没有特殊含义的

    5. 字母在完全限定类名中可以是任何大小写的组合

    6. 所有类名必须以大小写敏感的方式引用

  3. 当从完全限定类名载入文件时:
    1. 在完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录

    2. 在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配

    3. 终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配

  4. 自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值

注:具体规范内容参考了其他中文翻译版本整理。

PHP的PSR系列规范都有啥内容的更多相关文章

  1. php开发规范-psr系列规范

    转自:http://www.cnblogs.com/x3d/p/php-psr-standards.html PSR 是PHP Standard Recommendation的简写,它其实应该叫PSR ...

  2. PHP PSR 代码规范基本介绍

    PSR 是 PHP Standard Recommendation 的简写,即PHP推荐标准. 目前通过的规范有 PSR-0(Autoloading Standard).PSR-1(Basic Cod ...

  3. PHP PSR标准规范

    PHP PSR标准规范,PHP开发者都需要遵循规范. 官网(英文版本): https://www.php-fig.org 官网(中文版本): https://psr.phphub.org

  4. PSR标准规范

    PSR标准规范 基本代码规范 PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码: 类的命名 必须 遵循 StudlyCaps 大写开头的驼峰命名规范: 类中的常量所有字母都 必须 大写,单 ...

  5. openresty开发系列35--openresty执行流程之5内容content阶段

    openresty开发系列35--openresty执行流程之5内容content阶段 content 阶段 ---init阶段---重写赋值---重写rewrite---access content ...

  6. RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  7. RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  8. RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  9. psr的规范

    基本代码规范 本篇规范制定了代码基本元素的相关标准, 以确保共享的PHP代码间具有较高程度的技术互通性. 关键词 "必须"("MUST")."一定不可 ...

随机推荐

  1. Java-继承,多态练习0922-06

    编写一个Shape类,具有属性:周长和面积: 定义其子类三角形和矩形,分别具有求周长的方法. 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a.b,使用对象a.b来 ...

  2. EF架构~为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心

    回到目录 对EF开发来说,导航属性肯定都用过,事实上,它是由VS IDE工具根据你的数据库关系结构自动生成的外键属性,在类视图中可以看到相关属性,它是以外键表名来标识的,如果是一对多的关系,那么,它会 ...

  3. 01- Shell脚本学习--入门

    简介 Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说有多少 ...

  4. win2008 强制删除故障集群配置

    在正常删除Cluster 节点之后,再添加节点时,报“节点已经加入群集”,无法加入,注册表信息删除后可正常移除Cluster服务,如下: win2008故障转移群集无法退出节点时 删除注册表中这两个后 ...

  5. telnet命令——连接服务器

    Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接 ...

  6. 创建Cookie,简单模拟登录,记录登录名,购物车记录先前添加内容,session控制登录

     工作任务:模拟淘宝登录和购物车功能:使用cookie记录登录名,下次登录时能够记得上次的登录名,使用cookie模拟购物车功能,使用session记住登录信息并验证是否登录,防止利用url打开网站, ...

  7. 百度面试题 字符串相似度 算法 similar_text 和页面相似度算法

    在百度的面试,简直就是花样求虐. 首先在面试官看简历的期间,除了一个自己定义字符串相似度,并且写出求相似度的算法. ...这个确实没听说过,php的similar_text函数也是闻所未闻的.之前看s ...

  8. 每天一个linux命令(11):nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  9. Python的闭包

    Python的闭包 闭包概念都是一样的,实现机制一样,看看下面的代码是不是和javascript很像 def generate_counter(): cnt = [0] def count_one() ...

  10. KnockoutJS 3.X API 第二章 数据监控(2)监控属性数组

    监控属性数组 如果要对一个对象检测和响应变化,会使用监控属性.如果要对一个序列检测并监控变化,需要使用observableArray(监控属性数组).这在你显示或编辑多个值,需要用户界面的部分反复出现 ...