[英]Can PSR-0 class autoloader, load PEAR library?
所以這是我的問題,我編寫了自己的不符合PSR-0標准的類自動加載器。 這很容易。 現在我有了PHP MVC Frameowrk,我想使用Twig ,但是Twig放棄了使用_
代替\\
PEAR命名標准。
現在PSR-0自動加載器也應該能夠加載PEAR庫嗎? 由於在那些自動裝帶器中_
轉換為\\
? 如果我注冊了Twig,我的裝載機就無法裝載它,但可能是我在某個地方犯了一個錯誤。
與PSR-0兼容的類加載器是否也應該能夠加載PEAR庫?
與PSR-0兼容的類加載器是否也應該能夠加載PEAR庫?
是的,PSR-0與類和文件的PEAR命名約定可以互操作。
這不再是公開記錄,但它是眾所周知的。
如果無法加載這些類,則表明您的自動加載器不符合PSR-0。
仔細檢查規格 。 您還會發現在SplClassLoader
鏈接了一個與 PSR-0兼容的SplClassLoader
類 ,您可以使用它而不是自己的。
一個可能更好的加載器是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());
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;
}
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.