PHP の開発プロセスで、外部からクラスを導入する場合は、通常、include メソッドと require メソッドを使用して、クラスを定義するファイルをインクルードします。小規模に開発する場合には大きな問題はありません。ただし、大規模な開発プロジェクトでは、これを行うと大量の require または include メソッド呼び出しが生成され、効率が低下するだけでなく、コードの保守が困難になり、require_once のコストが非常に高くなります。
PHP5 より前は、各 PHP フレームワークがクラスの自動ロードを実装したい場合、通常、ディレクトリを横断し、特定の取り決めに従って合意されたルールに準拠するすべてのファイルを自動的にロードするクラスまたは関数を実装していました。 もちろん、PHP5 より前のオブジェクト指向のサポートはあまり良くなく、クラスの使用は現在ほど頻繁ではありませんでした。 PHP5 以降では、PHP クラスをロードするときに、クラスが配置されているファイルが含まれていない場合、またはクラス名が間違っている場合、Zend エンジンは自動的に __autoload 関数を呼び出します。この関数を使用するには、ユーザーが自分で __autoload 関数を実装する必要があります。 PHP5.1.2以降では、spl_autoload_register関数を使用して自動ロード処理機能をカスタマイズできるようになりました。この関数が呼び出されない場合、SPL のカスタム spl_autoload 関数がデフォルトで使用されます。
1. __自動ロードの例:
関数 __autoload($class_name) {
echo '__autload class:', $class_name, '
';
}
新しいデモ();
上記のコードは最後に __autload class:Demo を出力します。
その後、エラー メッセージが表示されます: 致命的なエラー: クラス「デモ」が見つかりません
通常、次のように _autoload を使用してクラスを自動的にロードします。
関数 __autoload($class_name) {
require_once ($class_name . “class.php”);
}
$memo= 新しいデモ
;
_autoload は少なくとも 3 つのことを行う必要があることがわかります。1 つ目は、クラス名に基づいてクラス ファイル名を決定することです。2 つ目は、クラス ファイルが配置されているディスク パスを決定することです (この例では、最も単純なケースでは、クラスを呼び出す PHP プログラム ファイルと同じフォルダーにあります)。3 番目の方法は、クラスをディスク ファイルからシステムにロードすることです。 3 番目のステップは最も単純で、include/require を使用するだけです。第 1 ステップと第 2 ステップの機能を実現するには、クラス名とディスク ファイル間のマッピング方法を開発時に合意する必要があります。この方法でのみ、クラス名に基づいて対応するディスク ファイルを見つけることができます。
したがって、含めるクラス ファイルが多数ある場合は、対応するルールを決定し、__autoload() 関数でクラス名と実際のディスク ファイルを一致させるだけで、遅延読み込み効果を実現できます。ここから、 __autoload() 関数の実装で最も重要なことは、クラス名と実際のディスク ファイルの間のマッピング ルールの実装であることもわかります。
2. spl_autoload_register() 関数
この関数の機能は、関数を SPL の __autoload 関数スタックに登録し、システムのデフォルトの __autoload() 関数を削除することです。これは以下の例で見ることができます:
function __autoload($class_name) {
echo '__autload class:', $class_name, '
関数 classLoader($class_name) {
echo 'SPL ロード クラス:', $class_name, '
';
}
spl_autoload_register('クラスローダー');
new Test();//結果:SPL ロード クラス:Test
構文: bool spl_autoload_register ([callback $autoload_function]) 2 つのパラメータを受け入れます。1 つはオートロード スタックに追加される関数で、もう 1 つはローダーがこのクラスを見つけられない場合に例外をスローするかどうかを示すフラグです。最初の引数はオプションで、デフォルトでは spl_autoload() 関数を指します。この関数は、小文字のクラス名と .php 拡張子または .ini 拡張子、あるいは spl_autoload_extensions( ) という名前のファイル。
クラス CalssLoader
{
パブリック静的関数ローダー($classname)
$class_file = strto lower($classname).".php";
If (file_exists($class_file)){
require_once($class_file);
}
//メソッドは静的メソッドです
spl_autoload_register('CalssLoader::loader');
$test = 新しいテスト();
spl_autoload_register() 関数が呼び出されると、未定義のクラスが呼び出されるとき、システムは __autoload() 関数を自動的に呼び出すのではなく、spl_autoload_register() 関数に登録されているすべての関数を順番に呼び出します。この状況を回避したい場合は、 spl_autoload_register() 関数のより安全な初期化呼び出しメソッドを使用する必要があります:
if(false === spl_autoload_functions()){
If(function_exists('__autoload')){
spl_autoload_registe('__autoload',false);
}
spl_autoload_functions() 関数は、登録された関数の配列を返します。SPL 自動ロード スタックが初期化されていない場合は、ブール値 false を返します。次に、__autoload() という名前の関数が存在するかどうかを確認します。存在する場合は、それを自動ロード スタックの最初の関数として登録し、その機能を保持できます。その後、引き続きオートロード機能を登録できます。
次に、 spl_autoload_call('className') 関数を呼び出すことで、そのクラスを使用せずにローダーを手動で呼び出すことができます。この関数を class_exists('className',false) と組み合わせて使用すると、クラスのロードを試行し、すべてのオートローダーがクラスを見つけられない場合は失敗します。
f(spl_autoload_call('className') && class_exists('className',false)){
} else {
(ネットワークコンテンツの概要)
Programming Life、guisuコラムより抜粋
http://www.bkjia.com/PHPjc/478291.html
www.bkjia.com
true