zoukankan      html  css  js  c++  java
  • 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. 可以通过前缀快速找到映射目录,提高自动加载的效率
  • 相关阅读:
    JS解析XML文件和XML字符串
    查询优化的方法
    Oracle 常用操作
    取得同一网段内的IP和MAC地址!
    域名知多少?
    Oracle 数据库链路 同义词
    提高查询速度的方法【百万级以上数据】
    ExtJs学习之路从Grid中得到数据
    一个左边停靠且可以展开和隐藏的菜单【Jquery插件】
    Go流程控制
  • 原文地址:https://www.cnblogs.com/sandea/p/9190874.html
Copyright © 2011-2022 走看看