php自动加载规范:PSR-0

[翻译自官网http://www.php-fig.org/psr/psr-0/]

自动加载规范

下面描述了自动加载操作时必须遵守的强制要求。

要求:

  • 一个完全合格的命名空间和类名必须有以下的结构 \()*
  • 每个命名空间必须有提供者名称(“Vendor Name”)作为顶级的命名空间
  • 每个命名空间可以有多个子命名空间
  • 每个命名空间在被从文件系统加载时须将分隔符转换为”系统分隔符”(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
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类。

http://gist.github.com/221634