PHP FIG - PSR-0 自动载入标准(Autoloading Standard)
·117 字·1 分钟
PHP
php
FIG
PSR
接下来描述的是强制性的要求,为了保障自动载入器(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 类的推荐方式: