PHP ではファイルを簡単にインクルードできるように Autoload が提供されていますが、Autoload は想像どおりにすべての状況を処理できるわけではありません。今日は、数日前に発生した Autoload に関する問題のいくつかを記録します。
自動ロードを使用する理由
PHP でクラスを使用する場合、require または include のどちらを使用しても使用前にクラスをロードする必要がありますが、ロードの決定に影響を与える 2 つの問題があります。
1 つは、このクラス ファイルがどこに保存されているかがわからないこと、もう 1 つは、このファイルをいつ使用する必要があるかがわからないことです。特にプロジェクトファイルの数が多い場合、各ファイルの先頭にrequireという長い文字列を書くのは不可能です...
PHP5 以降では、__autoload を通じてこの問題を解決できます。 また、PHP5.1 以降では、より完全なロード メカニズムを提供するために spl_autoload_register() も提供されています。
PHP での自動ロードの記事を読んだ後、クラス ファイルが extends を使用するか、他のクラスを使用する必要がある場合、クラスが new によってインスタンス化されると、PHP は定義された __autoload 関数を通じて対応するファイルをロードします。ファイルの場合、PHP はクラス ファイルを検索してロードするために自動ロードを再実行します。同じクラス ファイルに対する 2 つのリクエストが発生すると、エラーが報告されます。元の記事の著者は、この問題を説明するために 3 つの興味深い例を提供しました。これらの例は、ここからソース コードをダウンロードして表示できます。
一般に、ロード時に対応する場所でファイルが見つからないという問題を解決する方法はたくさんあります。最も一般的に使用されるのは、特定の命名標準を指定することです。
Zendのメソッド
zend は、ファイル名にパスを含める、最も一般的な方法の 1 つを推奨します。たとえば、次の例:
// Main.class
function __autoload($class_name) {
$path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);
require_once $path.'.php';
$temp = new Main_Super_Class(); 上記の例では、パス内のすべてのアンダースコアが区切り文字に置き換えられ、Main/Super/Class.php ファイルに到達します。
ファイル パスはクラス名にハードコーディングされています。フォルダー構造を変更する必要がある場合は、すべてのクラス名を手動で変更する必要があります。
「すべてを含める」メソッド
開発環境にいて、速度をあまり気にしない場合は、この方法を使用すると非常に便利です。すべてのクラス ファイルを 1 つまたは複数の特定のフォルダーに配置し、検索してロードします。 例: 代 コードをコピーします
コードは次のとおりです: & lt ;? PHP
$ arr = array );
//configuration.php
'MainSuperClass' = 'C:/Main/Super/Class.php',
'MainPoorClass' = 'C:/blablabla/gy.php'
);
というファイル
コードをコピーします
}
。