PHP规范PSR0和PSR4的理解

Posted sandea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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] view plain copy
 
  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 描述的是通过文件路径自动载入类的指南;它作为对 PSR-0 的补充;根据这个 指导如何规范存放文件来自动载入;
  1. 术语「类」是一个泛称;它包含类,接口,traits 以及其他类似的结构;

  2. 完全限定类名应该类似如下范例:

    <NamespaceName>(<SubNamespaceNames>)*<ClassName>

    1. 完全限定类名必须有一个顶级命名空间(Vendor Name);
    2. 完全限定类名可以有多个子命名空间;
    3. 完全限定类名应该有一个终止类名;
    4. 下划线在完全限定类名中是没有特殊含义的;
    5. 字母在完全限定类名中可以是任何大小写的组合;
    6. 所有类名必须以大小写敏感的方式引用;
  3. 当从完全限定类名载入文件时:

    1. 在完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录。
    2. 在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配;
    3. 终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配;
  4. 自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值;

在其中有以下的类实例,但是相对与PSR0,却是不太容易明白
技术分享图片
首先,SymfonyCoreRequest和endAcl很好理解,其满足PSR0规范,但是AcmeLogWriterFile_Writer就不太好理解了。

四、Composer对PSR4的处理

看了Composer对PSR4的处理,才能比较容易理解PSR4。自动生成的PSR4配置文件名称为autoload_psr4.php(PSR0的是autoload_namespace.php),配置文件返回一个关联数组,键是名称空间的前缀,值是名称空间前缀对应的路径。
 
以AcmeLogWriterFile_Writer作为例子,其名称空间前缀是AcmeLogWriter,则其在autoload_psr4.php表示为

  1. ‘\Acme\Log\Writer‘ => (array) ‘./acme-log-writer/lib/‘  
使用自动加载时,先通过名称空间的前缀,找到对应的映射路径,在根据PSR0规范找到对应的类定义文件。但是这里有些例外,类名中的下划线在PSR4中是不需要转换成目录的。
 
使用PSR4,我觉得有2个好处:
1. 减少代码目录的深度
2. 可以通过前缀快速找到映射目录,提高自动加载的效率

 

以上是关于PHP规范PSR0和PSR4的理解的主要内容,如果未能解决你的问题,请参考以下文章

Yaf框架下类的自动加载

PHP-自动加载原理分析

目前继续学习的方向

laravel的源码解析:PHP自动加载功能原理解析

支持psr4的自动加载类

PHP PSR4自动加载代码赏析