简单认识、区分psr-0和psr-4规范
前言
PSR 是 PHP Standard Recommendations (PHP 推荐标准)的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。
先来看看psr-0和psr-4的官方定义:
psr-0
一个标准的 命名空间 (namespace) 与 类 (class) 名称的定义必须符合以下结构:
其中
Vendor Name
为每个命名空间都必须要有的一个顶级命名空间名;需要的话,每个命名空间下可以拥有多个子命名空间;
当根据完整的命名空间名从文件系统中载入类文件时,每个命名空间之间的分隔符都会被转换成文件夹路径分隔符;
类名称中的每个
_
字符也会被转换成文件夹路径分隔符,而命名空间中的_
字符则是无特殊含义的。当从文件系统中载入标准的命名空间或类时,都将添加
.php
为目标文件后缀;组织名称(Vendor Name)
、命名空间(Namespace)
以及类的名称(Class Name)
可由任意大小写字母组成。
psr-4
术语「class」指的是类(classes)、接口(interfaces)、特征(traits)和其他类似的结构。
全限定类名具有以下形式:
- 全限定类名必须拥有一个顶级命名空间名称,也称为供应商命名空间(vendor namespace)。
- 全限定类名可以有一个或者多个子命名空间名称。
- 全限定类名必须有一个最终的类名(我想意思应该是你不能这样
\<NamespaceName>(\<SubNamespaceNames>)*\
来表示一个完整的类)。 - 下划线在全限定类名中没有任何特殊含义(在 PSR-0 中下划是有含义的)。
- 全限定类名可以是任意大小写字母的组合。
- 所有类名的引用必须区分大小写。
全限定类名的加载过程
- 在全限定的类名(一个「命名空间前缀」)中,一个或多个前导命名空间和子命名空间组成的连续命名空间,不包括前导命名空间的分隔符,至少对应一个「根目录」。
- 「命名空间前缀」后面的相邻子命名空间与根目录下的目录名称相对应(且必须区分大小写),其中命名空间的分隔符表示目录分隔符。
- 最终的类名与以
.php
结尾的文件名保持一致,这个文件的名字必须和最终的类名相匹配(意思就是如果类名是FooController
,那么这个类所在的文件名必须是FooController.php
)。
自动加载文件禁止抛出异常,禁止出现任何级别的错误,也不建议有返回值。
区别
最明显的区别就是psr4取消下划线转换规则了。
其次是psr4开始规定命名空间前缀,使得目录结构更加简洁。举栗子:
- 有composer依赖配置
那么就有
use church\testClass
, 对应src/testClass.php
- 有composer依赖配置
那么就有
use church\testClass
,对应src/church/testClass.php
因为psr0没有规定命名空间前缀,所以会把church\testClass解析成church/testClass.php,然后拼接基础目录。
- 有composer依赖配置
那么就有
简单认识、区分psr-0和psr-4规范
http://blog.icy8.cn/posts/36427/