• 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自动加载

    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表示为
    '<span style="font-size:14px;">Acme\Log\Writer</span>' => (array) './acme-log-writer/lib/'
    使用自动加载时,先通过名称空间的前缀,找到对应的映射路径,在根据PSR0规范找到对应的类定义文件。但是这里有些例外,类名中的下划线在PSR4中是不需要转换成目录的。
     
    使用PSR4,我觉得有2个好处:
    1. 减少代码目录的深度
    2. 可以通过前缀快速找到映射目录,提高自动加载的效率
  • 相关阅读:
    Makefile 跟着走快点
    MariaDB 复合语句和优化套路
    Unity Shader常用函数,标签,指令,宏总结(持续更新)
    ThreadLocal 简述
    Java全排列排序
    Thrift入门
    Nginx + Keepalived 双机热备
    Linux 虚拟IP
    Java 反编译
    Spring拦截器
  • 原文地址:https://www.cnblogs.com/liliuguang/p/14262714.html
Copyright © 2020-2023  润新知