SPL自動ロードのベスト・プラクティス
-
19-09-2019 - |
質問
サーバー側で私のinclude_pathでは、私は「を/ usr / share /梨/」で、梨のディレクトリへの参照を持っています。私のアプリケーションの中で、私はrequire_once 'library/file.php'
と「は、/ usr / share /梨/ライブラリ/」に住んで、共通ライブラリからのファイルが含まれています。
私は最近、SPLオートローダを使用し始めました、私はあなたがファイルを含めるようにしてロジックを決定する必要がありローダ機能に気づきました。これを行うための私の最初の方法は、例えば、ファイルをインクルードしようとしているし、それが失敗するかどうかを確認するために@
でそれを抑えました私はその後、@include 'library/file.php'
をやって、それを含め、@
は私が手動でget_include_path
でPATH_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
事業を行っている必要がありますか私は正しい方向にややそれをやっていますか?
解決
一つ Habariプロジェクトオートローダのことクラスが要求され、それがファイルを毎回ディスク検索を行っていないように、キャッシュはメモリ内の全クラスファイルリストはそれが面白いんです。
基本的に、あなたがそれらをロードするようになります、そのクラスでインデックス化クラスファイルの全ての配列を保持し、あなたの__autoload()
、内部の静的に宣言します。例えば、コードは、ディレクトリを使用するか、この静的な配列を生成するglob()
ます。
$class_files = array(
'user' => '/var/www/htdocs/system/classes/user.class.php',
);
次に、あなたは、単に正しいファイルを取得する$class_files[$class]
が含まれます。それはむしろ、新しいクラスが参照されるたびに、リストを生成したり、特定のファイル名を検索するよりも、一度にすべてのディスクからカタログを取得しますので、これは素晴らしく、スピーディーです。 (あなたはそれが作るどのくらいの速度差の驚くだろう。)
クラス名が配列のキーでない場合は、カスタム例外をスローまたは返却するスタブ/モッククラスを生成することができます。あなたはHabariシステムオートローダをチェックアウトする場合も、あなたは静的クラスのコンストラクタのようである、Habariが自動的にロードされるクラスに__static()
を実装していることがわかります。
include_once()
は避けるべきである、とあなたはインクルードするファイルをチェックした場合@
演算子は不要です。
他のヒント
私は個人的に使用して道を行く
function autoload($class) {
/* transform class name into filename ... */
include $class;
}
でも、デバッグを容易にするために、@なし(エラーがシャットダウンされている/生産でログイン)
また、PHP開発者のリストに関連する議論に興味があるかもしれません:のhttp:/ /marc.info/?t=125787162200003&r=1&w=2する