PHP でクラスを使用する場合、require または include のどちらを使用しても、使用前にクラスをロードする必要がありますが、ロードの決定に影響を与える 2 つの問題があります
PHP では、これを助けるために Autoload が提供されています ファイルをインクルードするのは便利ですが、 autoload は想像どおりにすべての状況に対応できるわけではありません。今日は、数日前に遭遇した autoload に関するいくつかの問題を記録します。
なぜ Autoload を使うのか
PHP でクラスを使用する場合、require または include によって使用する前にクラスをロードする必要がありますが、ロードに影響を与える 2 つの問題があります。
1 つは、このクラス ファイルがどこに保存されているかがわからないこと、もう 1 つは、このファイルをいつ使用する必要があるかがわからないことです。特にプロジェクトファイルの数が多い場合、各ファイルの先頭に require という長い文字列を記述することは不可能です...
PHP5 以降では、オートロードによってこの問題を解決できます。 また、PHP5.1 以降では、より完全なロード メカニズムを提供するために spl_autoload_register() も提供されています。
「PHP での自動ロード」の記事を読んだ後、クラスが new によってインスタンス化されるとき、このクラス ファイルが extends を使用する場合、または実装で必要な場合、PHP は対応するファイルを読み込みます。他のクラス ファイルを使用する場合、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 つまたは複数の特定のフォルダーに配置し、検索してロードします。
例:
コードは次のとおりです:
<?php $arr = array ( 'Project/Classes', 'Project/Classes/Children', 'Project/Interfaces' ); foreach($arr as $dir) { $dir_list = opendir($dir); while ($file = readdir($dir_list)) { $path = $dir.DIRECTORY_SEPARATOR.$file; if(in_array($file, array('.', '..')) || is_dir($path)) continue; if (strpos($file, ".class.php")) require_once $path; } } ?>
ファイルと場所の関連付け別の方法は、クラスファイルをその場所に関連付ける
設定ファイル// configuration.php array_of_associations = array( 'MainSuperClass' = 'C:/Main/Super/Class.php', 'MainPoorClass' = 'C:/blablabla/gy.php' );
というファイル コードは次のとおりです:
<?php require 'autoload_generated.php'; function autoload($className) { global $autoload_list; require_once $autoload_list[$className]; } $x = new A(); ?>
もちろん、ファイルが多すぎるとメンテナンスが面倒になりますが、どちらが良いですか? -クラス名の場所をコーディングしますか?
もちろん、このリストを手動で管理する必要はないので、このファイルの自動生成を使用してこれを実現できます。元の記事の著者は、このようなツールを実装しました。よく考えてみると、元の記事の著者は、学ぶ価値のある小さな Autoload フレームワークさえ開発しました。
以上がphpオートロードの使い方まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。