自动加载
-
必须 (MUST)
: 绝对,严格遵循,无条件遵守; -
一定不可 (MUST NOT)
: 严令禁止; -
应该 (SHOULD)
: 强烈建议这样做,但是不强求; -
不该 (SHOULD NOT)
: 强烈不建议这样做,但是不要求; -
可以 (MAY)
和可选 (OPTIONAL)
: 选择性高一点,在这个文档内,此词语使用较少;
1. Overview
PSR-4 描述了从文件路径中 自动加载 类的规范。它拥有非常好的兼容性,可以用于任何其他自动加载规范之外,包括 PSR-0。该 PSR 还描述了将根据规范自动加载的文件放在何处。
2. 规范 (Specification)
「class」术语指的是 类 (classes)、 接口 (interfaces)、 特征 (traits) 和 其他类似的结构。
-
一个 完全限定类名 具有以下形式:
\<NamespceName>(\<SubNamespaceNames>)*\<ClassName>
完全限定类名 必须 拥有一个顶级命名空间名称,也被称作为「供应商命名空间」 (vendor namespace)。
完全限定类名 可以 有一个或者多个子命名空间名称。
完全限定类名 必须 有一个终止类名。PS:应该是指不能这样
\<NamespaceName>(\<SubNamespace>)*\
来表示一个完整的类。下划线在完全限定类名中没有任何特殊含义。(PSR-0 中下划线是有含义的)
完全限定类名中的字母字符 可以 是任意的大写和小写的组合。
所有类名都必须以区分大小写的方式引用。
-
When loading a file that corresponds(符合,一致) to a fully qualified class name …
在完全限定的类名(一个「名称空间前缀」)中,由一个或多个前导名称空间和子名称空间名称(不包括前导名称空间分隔符)组成的连续命名空间至少对应一个「基准目录」。
「名称空间前缀」后面的相邻子命名空间与根目录下的目录名称相对应(且 必须 区分带小写),其中名称空间的分隔符表示目录分隔符。
最终的类名与以
.php
结尾的文件的文件名保持一致。文件的名称 必须 与最终类名的大小写匹配。
自动加载器的实现 一定不可 抛出异常,一定不可 引发任何级别的错误,也 不该 返回值。
3. 案例
下表显示了与给定的 「完全限定类名」、「命名空间前缀」和 「基准目录」相对应的文件的路径。
「完全限定类名」 | 「命名空间前缀」 | 「基准目录」 | 生成的文件路径 |
---|---|---|---|
\Acme\Log\Writer\File_Writer | Acme\Log\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
\Aura\Web\Response\Status | Aura\Web | /path/to/aura-web/src/ | /path/to/aura-web/src/Response/Status.php |
\Symfony\Core\Request | Symfony\Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php |
\Zend\Acl | Zend | /usr/includes/Zend/ | /usr/includes/Zend/Acl.php |
想要了解一个符合规范的自动加载器的实现可以查看示例文件。示例中的自动加载器 一定不可 视为规范的一部分,它随时都可能发生改变。