3

たとえば、次のコードがあるとします。

$foo = new bar();

そして、このようなオートローダー。

function autoload($class_name) {
    $class_file_name = str_replace('_', '/', $class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
    }
}

しかし、本当にロードしたいクラスは「foo/bar.php」フォルダーにあり、実際のクラス名は実際には foo_bar です。自動ロードされるクラスの名前を動的に変更する方法はありますか? 例えば、こんな感じでしょうか。

function autoload(&$class_name) {
    $class_name = 'foo_' . $class_name;
    $class_file_name = str_replace('_', '/', $class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
    }
}

このようなことが可能かどうかはわかっていますが、それは正確なベストプラクティスではありませんが、そうであるかどうかを知りたいです.

4

2 に答える 2

3

いいえ。別のファイルをロードできます。ファイルを読み込めませんでした。複数のファイルをロードできます。しかし、オートロードの後、PHP はクラスが呼び出されたように存在することを期待します。

クラス X を呼び出しても、魔法のように PHP クラス Y を与えることはできません。

そのようにファイルシステムをセットアップするだけで十分かもしれませんが、それでもリテラルのクラス名を保持しますか?

PS
私もこれがずっと欲しかった。名前空間にまだアクセスできなかったとき。これで、すべての問題が解決しました =) 名前空間にアクセスできる場合は、PSR-0を「勉強」する必要があります。

于 2011-05-02T20:10:12.620 に答える
0

たぶん、次のようにclass_aliasを使用できます。

  • PHP にはクラス X が必要です
  • 代わりにクラス Y をロードします。
  • クラス Y のエイリアス X を作成すると、X は Y のように動作します。

例えば:

function autoload($class_name) {
    $real_class_name = 'foo_' . $class_name;
    $class_file_name = str_replace('_', '/', $real_class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
        class_alias($real_class_name, $class_name);
    }
}

それがあなたを助けることを願っています。

于 2011-05-02T20:29:08.070 に答える