简单认识、区分psr-0和psr-4规范

前言

PSR 是 PHP Standard Recommendations (PHP 推荐标准)的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。

先来看看psr-0和psr-4的官方定义:

psr-0

  • 一个标准的 命名空间 (namespace) 与 类 (class) 名称的定义必须符合以下结构:

    \<Vendor Name>\(<Namespace>\)*<Class Name>;  
  • 其中 Vendor Name 为每个命名空间都必须要有的一个顶级命名空间名;

  • 需要的话,每个命名空间下可以拥有多个子命名空间;

  • 当根据完整的命名空间名从文件系统中载入类文件时,每个命名空间之间的分隔符都会被转换成文件夹路径分隔符;

  • 类名称中的每个 _ 字符也会被转换成文件夹路径分隔符,而命名空间中的 _ 字符则是无特殊含义的。

  • 当从文件系统中载入标准的命名空间或类时,都将添加 .php 为目标文件后缀;

  • 组织名称(Vendor Name)命名空间(Namespace) 以及 类的名称(Class Name) 可由任意大小写字母组成。

psr-4

  1. 术语「class」指的是类(classes)、接口(interfaces)、特征(traits)和其他类似的结构。

  2. 全限定类名具有以下形式:

    \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    • 全限定类名必须拥有一个顶级命名空间名称,也称为供应商命名空间(vendor namespace)。
    • 全限定类名可以有一个或者多个子命名空间名称。
    • 全限定类名必须有一个最终的类名(我想意思应该是你不能这样 \<NamespaceName>(\<SubNamespaceNames>)*\ 来表示一个完整的类)。
    • 下划线在全限定类名中没有任何特殊含义(在 PSR-0 中下划是有含义的)。
    • 全限定类名可以是任意大小写字母的组合。
    • 所有类名的引用必须区分大小写。
  3. 全限定类名的加载过程

    • 在全限定的类名(一个「命名空间前缀」)中,一个或多个前导命名空间和子命名空间组成的连续命名空间,不包括前导命名空间的分隔符,至少对应一个「根目录」。
    • 「命名空间前缀」后面的相邻子命名空间与根目录下的目录名称相对应(且必须区分大小写),其中命名空间的分隔符表示目录分隔符。
    • 最终的类名与以.php 结尾的文件名保持一致,这个文件的名字必须和最终的类名相匹配(意思就是如果类名是 FooController,那么这个类所在的文件名必须是 FooController.php)。
  4. 自动加载文件禁止抛出异常,禁止出现任何级别的错误,也不建议有返回值。

区别

  1. 最明显的区别就是psr4取消下划线转换规则了。

  2. 其次是psr4开始规定命名空间前缀,使得目录结构更加简洁。举栗子:

    • 有composer依赖配置
      {    
       "autoload": {        
         "psr-4": {            
            "church\\": "./src/"
          }
        }
      }
      那么就有use church\testClass, 对应src/testClass.php
    • 有composer依赖配置
      {    
         "autoload": {        
             "psr-0": {            
                "church\\": "./src/"
              }
          }
      }
      那么就有use church\testClass,对应src/church/testClass.php
      因为psr0没有规定命名空间前缀,所以会把church\testClass解析成church/testClass.php,然后拼接基础目录。

简单认识、区分psr-0和psr-4规范
http://blog.icy8.cn/posts/36427/
作者
icy8
发布于
2021年1月3日
许可协议