PHP でオートロードを実装するには 2 つの方法があります:
1. インターセプター __autoload()
2. グローバル変数関数ポインター autoload_func を指定された関数に設定します。通常、C 拡張機能で使用されます
基本的に、前者は後者を通じて実装されます。
解析処理、PHP5.3.6ソースコード
=>Zend/zend_vm_def.h 1894行
ZEND_VM_HANDLER(109,ZEND_FETCH_CLASS,...
=>zend_execute_API.c 1526行
zend_class_entry *zend_fetch_class(const char *class_name,...
=>zend_execute_API.c 1564 行
if(zend_lookup_class_ex(class_name,class_name_len,...
=>zend_execute_API.c 1039 行
ZEND_API int zend_lookup_class_ex (con st char *na 。
=>zend_execute_API.c 1121 行
retval = zend_call_function(&fcall_info, &fcall_cache TSRMLS_CC)
=>zend_execute_API.c 758 行
zend_call_function
名前が示すように、zend_call_function の主な機能は次のとおりです。 PHP 関数を呼び出します。そのパラメーター fcall_info と fcall_cache は、それぞれ zend_fcall_info と zend_fcall_info_cache という 2 つの重要な構造体を指します。
zend_call_function の主なワークフローは次のとおりです:
fcall_cache.function_handler が NULL でない場合、fcall_cache.function_handler が指す関数が直接実行されます。
fcall_cache.function_handler が NULL の場合、fcall_info.function_name という名前の関数を検索し、存在する場合はそれを実行します。
は次のように要約されます。
自動ロード メカニズムの主な実行プロセスは次のとおりです。
(1) executor global 変数関数ポインタ autoload_func が NULL かどうかを確認する
(2) autoload_func が NULL でない場合、__autoload() 関数が定義されているかどうかを確認せずに、autoload_func ポインタが指す関数を直接実行してクラスをロードします。
(3) autoload_func が NULL の場合、システムに __autoload() 関数が定義されているかどうかを確認します。定義されていない場合は、エラーが報告されて終了します。__autoload() 関数が定義されている場合は、__autoload() が実行されてクラスのロードが試行され、ロード結果が返されます。
自動ロードにより、オブジェクト指向とコードの再利用が容易になりますが、複数のクラス ライブラリで異なる __autoload が使用されると混乱が生じる可能性があります。
これは、さまざまな開発者のインターセプター関数を自動ローディング関数のハッシュテーブルに登録する spl_autoload で解決できます。
自動ローディングを実装するための spl のメカニズムは、自動ローディング機能を備えたさまざまな関数を格納するハッシュテーブルを維持することです。
自動ロードメカニズムがトリガーされると、zend はクラスが正常にロードされるまで、またはロードが失敗した後に戻るまで、このハッシュテーブル内の関数を走査して実行します。
オートロード関数を使用する必要がある場合は、関数 spl_autoload_register() または spl_autoload_register('autoloadfuncitonname') を使用します。
パラメータなしの spl_autoload_register() は、デフォルトで spl_autoload() 関数をロードします。この関数は機能が制限されており、 include_path クラス ライブラリで指定された拡張子。
パラメーターを指定した spl_autoload_register() は、デフォルトでは spl_autoload() 関数をロードしなくなりました。
配列を返す spl_autoload_functions() を使用して、現在のオートロード ハッシュテーブル内の関数を表示できます
注: spl_autoload を使用する場合、spl_autoload_register('__autoload') を使用してハッシュテーブルに明示的に追加されない限り、システムはインターセプター __autoload を無視します
phpのソースコードを見るレベルはちょっとすごいと思います
つまり、家を買うには土木の理解が必要です