5

サーバー側のinclude_pathには、「/ usr / share /pear/」にあるpearディレクトリへの参照があります。私のアプリケーションには、「/ usr / share / pear /library/」にある共通ライブラリのファイルを含めていますrequire_once 'library/file.php'

最近、splオートローダーの使用を開始しました。ローダー関数で、ファイルを含めるロジックを決定する必要があることに気付きました。これを行う最初の方法は、ファイルをインクルードし、@それが失敗するかどうかを確認するためにそれを抑制することでした。たとえば、悪い習慣であること@include 'library/file.php'について多くのことを読んだことが主な理由で、そして、ディレクトリが私が望むものであるかどうかを確認し、それを実行してそれを含めます。@get_include_pathPATH_SEPARATORfile_exists

そのようです:

function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
        $exists = false;
        foreach ( $paths as $path ) 
        {
            $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
            if ( file_exists ( $tmp ) ) 
            {
            $exists = true;
            $file = $tmp;
            }
        }
        if ( !$exists ) { return false; }
    }
    include $file;
}

spl_autoload_register('classLoader');

私は間違ったルートに行きましたか?私はちょうど@includeビジネスをするべきでしたか、それとも私はそれをいくらか正しい方向にやっていますか?

4

2 に答える 2

7

Habariプロジェクトオートローダーが行う興味深いことの1つは、クラスファイルリスト全体をメモリにキャッシュして、クラスが要求されるたびにファイルのディスク検索を実行しないようにすることです。

基本的に、すべてのクラスファイルの配列を保持するstaticを内部で宣言し、__autoload()それらをロードさせるクラスによってインデックスが付けられます。たとえば、コードはDirを使用するか、次のglob()静的配列を生成します。

$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

$class_files[$class]次に、正しいファイルを取得するために含めるだけです。これは、新しいクラスが参照されるたびにリストを生成したり特定のファイル名を検索したりするのではなく、ディスクからカタログを一度に取得するため、便利でスピーディーです。(速度の違いがどれだけあるかに驚かれることでしょう。)

クラス名が配列内のキーでない場合は、カスタム例外をスローするか、スタブ/モッククラスを生成して返すことができます。また、Habariシステムオートローダーを確認すると、Habari__static()が自動ロードされるクラスに実装されていることがわかります。これは、静的クラスのコンストラクターのようなものです。

include_once()避けるべきであり、@含めるファイルをチェックした場合は演算子は不要です。

于 2009-11-11T19:25:48.663 に答える
1

私は個人的に

function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

デバッグを容易にするための@がなくても(エラーはシャットダウン/本番環境にログインします)

PHP開発者リストの関連する議論にも興味があるかもしれません:http://marc.info/?t = 125787162200003&r = 1&w = 2

于 2009-11-11T08:42:47.683 に答える