PHP FIG - PSR-0 自动载入标准(Autoloading Standard)

·117 字·1 分钟
PHP php FIG PSR
n3xtchen
作者
n3xtchen
Sharing Funny Tech With You

译自 http://www.php-fig.org/psr/psr-0/

接下来描述的是强制性的要求,为了保障自动载入器(Autoloader)的通用性( Interoperability),必须坚持该原则。

强制性 #

  • 完整的命名空间(Namespace)和类(Class)必须遵循如下结构:

    \<VendorName>\(<NameSpace)\)*<Class Name>

  • 每一个命名空间必须有一个顶级命名空间(Vendor Name);

  • 每一个命名空间都可以有多个子命名空间;

  • 每一个命名空间的分隔符都必须转化成 DIRECTORY_SEPARATOR,当它被文件系统载入时;

  • 每一个在类名中的 _ 符号都会被转化成 DIRECTORY_SEPARATOR。而 _ 符号在 命名空间中没有任何意义;

  • 完整的的命名空间和类当从文件系统中被加载的时候,都会以 .php 为后缀;

  • Vendor 名,命名空间和类名中的英文字符可以是任意大小写的组合;

范例 #

  • \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

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

  • mespace\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

这里我们设定的标准应该是无痛自动加载器通用性的最低共同标准。你可以使用下面 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;
}

SplClassLoader 的实现 #

下面的 gist 是一个 SplClassLoader 实现的范例代码;如果你编写符合上述的标准,你就可 以利用它来自动加载你的类。这是一个目前用来加载 PHP 5.3 类的推荐方式: