PHP规范PSR0和PSR4的理解
⼀、PSR0简介
下⽂描述了若要使⽤⼀个通⽤的⾃动加载器(autoloader),你所需要遵守的规范:
⼀个完全标准的命名空间(namespace)和类(class)的结构是这样的:\<Vendor Name>\(<Namespace>\)*<Class Name>
每个命名空间(namespace)都必须有⼀个顶级的空间名(namespace)("组织名(Vendor Name)")。
每个命名空间(namespace)中可以根据需要使⽤任意数量的⼦命名空间(sub-namespace)。
从⽂件系统中加载源⽂件时,空间名(namespace)中的分隔符将被转换为 DIRECTORY_SEPARATOR。
类名(class name)中的每个下划线_都将被转换为⼀个DIRECTORY_SEPARATOR。下划线_在空间名(namespace)中没有什么特殊的意义。
完全标准的命名空间(namespace)和类(class)从⽂件系统加载源⽂件时将会加上.php后缀。
组织名(vendor name),空间名(namespace),类名(class name)都由⼤⼩写字母组合⽽成。
参考:
以下,列出PSR0构建的规范类的⼏种形式:
⼆、实现PSR0⾃动加载
[php]
1. function autoload($className)
2. {
3.    $className = ltrim($className, '\\');
4.    $fileName  = '';
5.    $namespace = '';
6.    if ($lastNsPos = strrpos($className, '\\')) {
7.        $namespace = substr($className, 0, $lastNsPos);
8.        $className = substr($className, $lastNsPos + 1);
9.        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
10.    }
11.    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
12.
13.    require $fileName;
14. }
15. spl_autoload_register('autoload');
三、PSR4简介
这个 PSR 描述的是通过⽂件路径 类的指南;它作为对  的补充;根据这个 指导如何规范存放⽂件来⾃动载⼊;
1. 术语「类」是⼀个泛称;它包含类,接⼝,traits 以及其他类似的结构;
2. 完全限定类名应该类似如下范例:
<NamespaceName>(<SubNamespaceNames>)*<ClassName>
1. 完全限定类名必须有⼀个顶级命名空间(Vendor Name);
2. 完全限定类名可以有多个⼦命名空间;
3. 完全限定类名应该有⼀个终⽌类名;
4. 下划线在完全限定类名中是没有特殊含义的;
5. 字母在完全限定类名中可以是任何⼤⼩写的组合;
6. 所有类名必须以⼤⼩写敏感的⽅式引⽤;
3. 当从完全限定类名载⼊⽂件时:
1. 在完全限定类名中,连续的⼀个或⼏个⼦命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),⾄少对应着
国内php空间⾄少⼀个基础⽬录。
2. 在「命名空间前缀」后的连续⼦命名空间名称对应⼀个「基础⽬录」下的⼦⽬录,其中的命名 空间分隔符表⽰⽬录分
隔符。⼦⽬录名称必须和⼦命名空间名⼤⼩写匹配;
3. 终⽌类名对应⼀个以 .php  结尾的⽂件。⽂件名必须和终⽌类名⼤⼩写匹配;
4. ⾃动载⼊器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值;
参考:
在其中有以下的类实例,但是相对与PSR0,却是不太容易明⽩
⾸先,\Symfony\Core\Request和\Zend\Acl很好理解,其满⾜PSR0规范,但是\Acme\Log\Writer\File_Writer就不太好理解了。
四、Composer 对PSR4的处理
看了Composer对PSR4的处理,才能⽐较容易理解PSR4。⾃动⽣成的PSR4配置⽂件名称为autoload_psr4.php(PSR0的是
autoload_namespace.php),配置⽂件返回⼀个关联数组,键是名称空间的前缀,值是名称空间前缀对应的路径。
以\Acme\Log\Writer\File_Writer作为例⼦,其名称空间前缀是\Acme\Log\Writer,则其在autoload_psr4.php表⽰为
使⽤⾃动加载时,先通过名称空间的前缀,到对应的映射路径,在根据PSR0规范到对应的类定义⽂件。但是这⾥有些例外,类名中的下划线在PSR4中是不需要转换成⽬录的。
使⽤PSR4,我觉得有2个好处:
1. 减少代码⽬录的深度
2. 可以通过前缀快速到映射⽬录,提⾼⾃动加载的效率[php]
1. '\<span >\Acme\\Log\\Writer</span>' => (array) './acme-log-writer/lib/'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。