簡體   English   中英

PSR-0類自動加載器可以加載PEAR庫嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM