0

オートローダーに問題があります:

public function loadClass($className) {
    $file = str_replace(array('_', '\\'), '/', $className) . '.php';
    include_once $file;
}

ご覧のとおり、非常に簡単です。クラスのファイル名を推測して、それを含めようとします。しかし、私には問題があります。存在しないクラスを読み込もうとすると例外が発生します(例外をスローするエラーハンドラーがあるため)。これは、存在しないクラスでclass_exists()を使用したときにも発生するため、不便です。例外は必要ありません。「false」が返されるだけです。

インクルードの前に@を付けることでこれを以前に修正しました(すべてのエラーを抑制します)。ただし、これの大きな欠点は、このインクルードのパーサー/コンパイラーエラー(致命的)が(ログにも表示されない)表示されず、バグを見つけるのが困難になることです。

両方の問題を一度に解決するための最良の方法は何でしょうか?最も簡単な方法は、オートローダー(擬似コード)に次のようなものを含めることです。

foreach (path in the include_path) {
    if (is_readable(the path + the class name)) readable = true;
}
if (!readable) return;

でも、そこでのパフォーマンスが気になります。それは大いに傷つくでしょうか?


(解決済み)次のようにしました:

public function loadClass($className) {

    $file = str_replace(array('_', '\\'), '/', $className) . '.php';    
    $paths = explode(PATH_SEPARATOR, get_include_path());
    foreach ($paths as $path) {
        if (is_readable($path . '/' . $file)) {
                        include_once $file;
                        return;
                    }
    }

}
4

4 に答える 4

0

クラスごとに 1 回だけ呼び出されるため、パフォーマンスは問題になりません。

于 2009-08-24T18:40:45.027 に答える
0
 public function loadClass($className) {
     $file = str_replace(array('_', '\\'), '/', $className) . '.php';
     if(is_readable($file))
       include_once $file;
 }

is_readable はパフォーマンスに大きな違いはありません。

于 2009-08-24T18:42:31.637 に答える
0

class_exists() には 2 番目のパラメーターautoloadがあり、FALSE に設定すると、存在しないクラスのオートローダーをトリガーしません。

于 2009-08-24T18:44:19.857 に答える