spl_autoloadはSPLが実装するデフォルトの自動ロード機能で、機能は比較的シンプルです。 2 つのパラメータを受け取ることができます。最初のパラメータはクラス名を表します。2 番目のパラメータ $file_extensions は、クラス ファイルの拡張子名を表します。 $file_extensions" title="拡張子">拡張子名で複数の拡張子を指定します。セミコロンで区切ってください。指定しない場合は、デフォルトの拡張子" title="拡張子名"> 拡張子 .inc または .php が使用されます。 spl_autoload は、まず $class_name を小文字に変更し、次にすべてのインクルード パスで $class_name.inc または $class_name.php ファイルを検索し、見つかった場合はクラス ファイルを手動でロードします。実際、複数の拡張子を指定できる点を除けば、spl_autoload("person", ".class.php") を使用します。
spl_autoload を自動的に動作させる、つまり autoload_func を spl_autoload にポイントする方法は?答えは、spl_autoload_register 関数を使用することです。 PHP スクリプトで初めてパラメータを指定せずに spl_autoload_register() を呼び出すと、autoload_func を spl_autoload に指定できます。
上記の説明を通じて、spl_autoload の機能は比較的単純であり、SPL 拡張機能で実装されており、その機能を拡張できないことがわかりました。独自のより柔軟な自動読み込みメカニズムを実装したい場合はどうすればよいでしょうか?この時点で、spl_autoload_call 関数がデビューします。
まず、spl_autoload_call の実装の素晴らしい機能を見てみましょう。 SPL モジュール内には、本質的に HashTable であるグローバル変数 autoload_functions がありますが、リンク リスト内の各要素は、次の機能を持つ関数を指す関数ポインターであると単純に考えることができます。クラスの自動ロード機能。 spl_autoload_call の実装自体は非常に単純で、リンクされたリスト内の各関数を順番に実行し、各関数の実行後に必要なクラスがロードされたかどうかを判断し、ロードが成功した場合はそのままリターンします。リンクされたリストの他の機能を実行し続けます。このリンクされたリスト内のすべての関数が実行された後でクラスがロードされていない場合、spl_autoload_call はユーザーにエラーを報告せずに直接終了します。したがって、オートロード メカニズムを使用しても、クラスが自動的に正しくロードされることは保証されません。キーはオートロード関数の実装方法に依存します。
php5 の標準ライブラリ メソッド spl_autoload は、独自の __autoload を実装するのと同等です
登録ディレクトリ内で $classname と同じ名前の .php/.inc ファイルが自動的に検索されます。もちろん、拡張子を登録することで特定の種類のファイルを指定することもできます
この方法では、.some ファイルも検索されます。デフォルトでは、php は spl_autoload を開始しません。では、spl_autoload を自動的に有効にするにはどうすればよいでしょうか?その方法は
spl_autoload_register には $callback パラメータがあり、指定しない場合は、さらに自動ロード ディレクトリを検索するために、これらのコードの前に自動ロード ディレクトリを設定できます
。
このように、phpは指定されたクラスが見つからない場合、set_include_pathで指定されたディレクトリ内を検索します。
これらのメソッドは php フレームワークで一般的に使用されます。たとえば、上記の紹介文をつなぎ合わせます:
some/path の下に classA クラスをロードする場合、ディレクトリ内で classa.php または classa.inc または classa.some が検索されるため、新しい classA を安全に使用したり、classA を拡張したりできます
$a = 新しいクラスA;
$b = 新しいクラス B;