2

これが私の質問です。PSR-0 標準に準拠した独自のクラス オートローダーを作成しました。簡単だ。今、私は PHP MVC Frameowrk を持っており、 Twigを使用したいと考えていますが、Twig_\.

PSR-0 オートローダも PEAR ライブラリをロードできるというのは本当ですか? これらのオートローダーの内部_\? Twig を登録するとローダーが読み込めませんが、どこかでミスをしたのかもしれません。

PSR-0 互換クラス ローダーは PEAR ライブラリもロードできるようにする必要がありますか?

4

2 に答える 2

1

PSR-0 互換クラス ローダーは PEAR ライブラリもロードできるようにする必要がありますか?

はい、PSR-0 は、クラスおよびファイルの PEAR 命名規則と相互運用可能です。

これはもはや公的に文書化されていませんが、一般的に知られています。

クラスをロードできない場合、オートローダーは PSR-0 に準拠していません。

仕様を再確認してくださいSplClassLoaderそこにリンクされている PSR-0 互換のクラスもあり、独自のクラスの代わりに使用できます。

おそらくより良いローダーはThe Symfony2 ClassLoader Componentです。Pear または Composer ( Packagist の symfony/class-loader )を介して簡単にインストールできます。

独自のクラスローダを作成する場合は、慎重に作業してspl_autoload_registerください。 を参照してください。


ボーナス機能:

PHP と同じようにspl_autoload_register動作させるには、インクルード パスに 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 に答える