2

所以这是我的问题,我编写了属于 PSR-0 标准的自己的类自动加载器。这很容易。现在我有我的 PHP MVC Frameowrk 并且我想使用Twig,但是 Twig 使用 PEAR 命名标准_而不是\.

现在 PSR-0 自动加载器是否也应该能够加载 PEAR 库?既然在那些 Autoloaders 里面_被转换成\? 如果我注册它,我的加载器将无法加载 Twig,但可能是我在某个地方犯了错误。

PSR-0 兼容的类加载器也应该能够加载 PEAR 库吗?

4

2 回答 2

1

PSR-0 兼容的类加载器也应该能够加载 PEAR 库吗?

是的,PSR-0 可以与类和文件的 PEAR 命名约定互操作。

这不再公开记录,但众所周知。

如果您无法加载类,则说明您的自动加载器不符合 PSR-0。

仔细检查规范。您还将在SplClassLoader那里找到一个与 PSR-0 兼容的类链接,您可以使用它来代替您自己的。

一个可能更好的加载器是Symfony2 ClassLoader Component。您可以通过 Pear 或 Composer(Packagist 上的 symfony/class-loader)轻松安装它。

如果您编写自己的类加载器,请注意使用spl_autoload_register,请参阅


奖励功能:

表现spl_autoload_register得像 PHP 一样,但 PSR-0 分辨率包含路径:

$spl_autoload_register_psr0 = function ($extensions = null) {
    $callback = function ($className, $extensions = null) {
        if (!preg_match('~^[a-z0-9\\_]{2,}$~i', $className)) {
            return;
        }
        null !== $extensions || $extensions = spl_autoload_extensions();
        $extensions = array_map('trim', explode(',', $extensions));
        $dirs = array_map('realpath', explode(PATH_SEPARATOR, get_include_path()));

        $classStub = strtr($className, array('_' => '/', '\\' => '/'));

        foreach ($dirs as $dir) {
            foreach ($extensions as $extension) {
                $file = sprintf('%s/%s%s', $dir, $classStub, $extension);
                if (!is_readable($file)) {
                    continue;
                }
                include $file;
                return;
            }
        }
    };
    return spl_autoload_register($callback);
};

var_dump(get_include_path());
var_dump(spl_autoload_extensions());
var_dump($spl_autoload_register_psr0());
于 2012-10-11T01:54:15.783 回答
0

PSR-0 应该能够使用完全限定的命名空间和带下划线的类。您需要做的就是用目录分隔符替换下划线。一个很好的例子是:

function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($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;
}

希望这可以帮助!

于 2012-10-10T21:21:08.110 回答