2009-11-11 17 views
5

サーバー側のinclude_pathには、 '/ usr/share/pear /'にあるpearディレクトリへの参照があります。私のアプリケーションの中には、共通ライブラリのファイルが含まれていて、 '/ usr/share/pear/library /'にあるファイルはrequire_once 'library/file.php'です。SPLオートロードのベストプラクティス

私は最近、スプラウト・オートローダーの使用を開始しました。私はローダー機能に気づいたので、ファイルを含めるロジックを決定する必要があります。これを行う私の最初の方法は、ファイルを含めることを試みて、それが抑制されるかどうかを確認するために@で抑制していました。 @include 'library/file.php'しかし、ほとんど私が多くのことを読んだのは、@が悪い練習をしているからです。手動で作業を自分で行うことを決めました。get_include_pathPATH_SEPARATORで、ディレクトリが私には欲しいと思っていたら、file_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ビジネスをやっているのですか、それともやっているのでしょうか?私は個人的にも、デバッグを容易にするために、@なし

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

を使用して道を行く

答えて

6

興味深いのは、クラスファイルが要求されるたびにファイルをディスクで検索しないように、クラスファイルリスト全体をメモリにキャッシュすることです。

基本的には、すべてのクラスファイルの配列を保持し、ロードさせるクラスによってインデックスされた__autoload()の内部に静的を宣言します。正しいファイルを取得するために

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

が次にあなたは、単に $class_files[$class]が含まれる:例えば、コードでは、この静的な配列を生成するには、dirまたは​​3210を使用します。新しいクラスが参照されるたびにリストを生成したり、特定のファイル名を検索したりするのではなく、ディスクからカタログを一度に取得するので、これは素早く迅速です。

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

include_once()は避けてください。含まれるファイルを確認した場合は、@演算子は不要です。

1

(エラーがシャットダウンされている/生産でログイン)

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

+3

splオートローディングはより現実的で現代的な方法ではありませんか?それとも基本的に同じものですか? –

関連する問題