所以这是我的问题,我编写了自己的类自动加载器,允许PSR-0标准。这很容易。现在我有了我的 PHP MVC Frameowrk,我想使用 Twig,但 Twig 允许使用 _
而不是 的梨命名标准。
现在,PSR-0 自动加载器也应该能够加载 PEAR 库,这是真的吗?既然在那些自动加载机里面_
变成了?如果我注册了 Twig,我的加载器无法加载它,但可能是我在某处犯了错误。
PSR-0兼容的类加载器是否也应该能够加载PEAR库?
PSR-0兼容的类加载器是否也应该能够加载PEAR库?
是的,PSR-0 可与类和文件的 PEAR 命名约定互操作。
这不再公开记录,但众所周知。
如果无法加载类,则自动加载器不符合 PSR-0
。仔细检查规格。您还会发现那里链接了一个与PSR-0兼容的SplClassLoader
类,您可以使用而不是自己的类。
一个可能更好的加载器是 Symfony2 类加载器组件。您可以通过Pear或Composer(Packagist上的symfony/class-loader)轻松安装它。
如果您编写自己的类加载器,请注意使用spl_autoload_register
,请参阅
- PHP spl_autoload_register与__autoload?
奖金功能:
要让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());
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;
}
希望这有帮助!