PHP PSR-0和PSR-4 自动加载标准

PSR-0:自动加载标准

已弃用 - 自2014-10-21起,PSR-0已被标记为已弃用。PSR-4现在被推荐作为替代品。

以下描述了自动装带器互操作性必须遵守的强制性要求。

强制性

  • 完全限定的命名空间和类必须具有以下结构 \<Vendor Name>\(<Namespace>\)*<Class Name>
  • 每个名称空间必须具有顶级名称空间(“供应商名称”)。
  • 每个命名空间可以包含任意数量的子命名空间。
  • 每个命名空间分隔符DIRECTORY_SEPARATOR在从文件系统加载时转换为。
  • _CLASS NAME中的每个字符都转换为a DIRECTORY_SEPARATOR。该_字符在命名空间中没有特殊含义。
  • .php从文件系统加载时,完全限定的命名空间和类是后缀。
  • 供应商名称,名称空间和类名称中的字母字符可以是小写字母和大写字母的任意组合。

例子

  • \Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
  • \Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
  • \Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
  • \Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php

命名空间和类名中的下划线

  • \namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
  • \namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php

我们在这里设定的标准应该是无痛自动加载器互操作性的最低标准。您可以通过使用能够加载PHP 5.3类的示例SplClassLoader实现来测试您是否遵循这些标准。

示例实现

下面是一个示例函数,用于简单地演示上述提议的标准是如何自动加载的。

<?php

function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

    require $fileName;
}
spl_autoload_register('autoload');

SplClassLoader实现

以下要点是一个示例SplClassLoader实现,如果您遵循上面提出的自动加载器互操作性标准,它可以加载您的类。这是目前推荐的加载符合这些标准的PHP 5.3类的方法。

 

PSR-4:自动加载器

本文档中的关键词“必须”,“必须”,“必需”,“应该”,“不应该”,“应该”,“不应该”,“推荐”,“可以”和“可选”按照RFC 2119中的描述进行解释。

1.概述

此PSR描述了从文件路径自动加载类的规范。它完全可互操作,除了包括PSR-0在内的任何其他自动加载规范外,还可以使用它。此PSR还描述了根据规范放置将自动加载的文件的位置。

2.规格

  1. 术语“类”指的是类,接口,特征和其他类似结构。

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

     \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    
    1. 完全限定的类名必须具有顶级命名空间名称,也称为“供应商命名空间”。

      扫描二维码关注公众号,回复: 4554922 查看本文章
    2. 完全限定的类名可以具有一个或多个子命名空间名称。

    3. 完全限定的类名必须具有终止类名。

    4. 下划线在完全限定类名的任何部分都没有特殊含义。

    5. 完全限定类名中的字母字符可以是小写和大写的任意组合。

    6. 必须以区分大小写的方式引用所有类名。

  3. 加载对应于完全限定类名的文件时...

    1. 完全限定类名称(“名称空间前缀”)中的一个或多个前导命名空间和子命名空间名称的连续系列(不包括前导命名空间分隔符)对应于至少一个“基本目录”。

    2. “名称空间前缀”之后的连续子命名空间名称对应于“基本目录”中的子目录,其中名称空间分隔符表示目录分隔符。子目录名称必须与子命名空间名称的大小写匹配。

    3. 终止类名对应于以.php。结尾的文件名。文件名必须与终止类名称的大小写相匹配。

  4. Autoloader实现绝不能抛出异常,不得引发任何级别的错误,并且不应返回值。

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

有关符合规范的自动加载器的实现,请参阅示例文件。示例实现不得视为规范的一部分,并且可以随时更改。

猜你喜欢

转载自blog.csdn.net/qq_39309714/article/details/83415228