ホームページ  >  記事  >  バックエンド開発  >  PHPのオートロード動作機構の解析例、オートロード例解析_PHPチュートリアル

PHPのオートロード動作機構の解析例、オートロード例解析_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:19:58739ブラウズ

PHPオートロード動作機構事例分析、オートロード事例分析

この記事では、PHP の自動ロード動作メカニズムのより詳細な分析を提供します。 PHP の動作原理を深く理解することは役立ちます。具体的な分析は次のとおりです:

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(const 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 グローバル変数関数ポインタ 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() 関数をロードします。この関数には機能が制限されており、inlcude_path で指定された拡張子を持つクラス ライブラリのみを検索できます。

パラメータを含む spl_autoload_register() は、デフォルトでは spl_autoload() 関数をロードしなくなりました。
現在の自動ロード ハッシュテーブル内の関数は、配列を返す spl_autoload_functions() を通じて表示できます

注: spl_autoload を使用する場合、spl_autoload_register('__autoload') を使用してハッシュテーブルに明示的に追加されない限り、システムはインターセプター __autoload を無視します

この記事が皆様のPHPプログラミングのお役に立てれば幸いです

phpの__autoload()の読み込みの問題

私が使用しているものを共有しましょう
// クラス関数 AutoLoad($classname){ // class $filepath = $classname . '.class.php' if (file_exists($filepath) ) { return include $filepath; } //lib ライブラリ ファイル $filepath = BASE_LIB . '.lib.php'; if (file_exists($filepath)) { return include $filepath('AutoLoad') ; :
//ログインを確認 User::is_loginin();//User を自動的にインスタンス化し、is_loginin を実行します

至急、PHPの__autoload関数とspl_autoload_register()関数についてネットで調べても理解できなかったので教えてください

__autoloadはクラスライブラリの自動読み込みによく使われます
これは、クラス名に従ってクラスファイルを見つけて、require_one
spl_autoload_register()するという方法です

__autoloadの最大の欠点は、複数のファイルをロードできないことです。 autoload メソッド

次のシナリオを考えてください。あなたのプロジェクトには __autoload があり、他の人のプロジェクトにも __autoload が存在します。このように、2 つの __autoload が競合します。解決策は __autoload を変更して 1 になるようにすることですが、これは間違いなく非常に面倒です。

そのため、spl の autoload シリーズ関数が表示されるように、autoload 呼び出しスタックを緊急に使用する必要があります。 spl_autoload_register を使用して、複数のカスタム オートロード関数を登録できます

PHP バージョンが 5.1 以降の場合は、spl_autoload を使用できます

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/871095.html技術記事 PHP のオートロード動作メカニズムの分析例 オートロード例の分析 この記事では、PHP のオートロード動作メカニズムのより詳細な分析を提供します。 PHP の動作原理を深く理解することは役立ちます。ツール...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。