ホームページ >バックエンド開発 >PHPチュートリアル >PHPカーネルの内部構造を深く理解する(5)関数、内部構造を深く理解する_PHPチュートリアル
PHP関数には、ユーザー定義関数、内部関数(print_r count...)、匿名関数、変数関数 ($func = ' print_r'; $func(array('a','b'));)
PHPカーネルソースコード内の関数は以下の種類に分類されます
リーリー1. ユーザー関数 (ZEND_USER_FUNCTION)
関数には明示的な戻り値があるとは限りません。PHP の実装では、明示的な戻り値がない場合でも、PHP カーネルは NULL を返します。
ZEND の実行プロセス中、ランタイム情報は _zend_execute_data に保存されます:
リーリープログラムの初期化プロセス中に、function_state も次の 2 つの部分で初期化されます。 リーリー
*arguments は関数パラメータへのポインタで、関数本体は *function に格納されます。*function は最終的にユーザー定義関数に関するすべての情報を格納する構造です。具体的な構造は次のとおりです。 リーリーzend_function の構造体の op_array には、関数内のすべての操作が格納されます。関数が呼び出されると、ZEND は op_array 内の opline を 1 つずつ順番に実行し、最終結果を返します。関数の定義と実行は分離されており、関数は独立した実行単位として存在できます。
2. 内部関数 (ZEND_INTERNAL_FUNCTION) ZEND_INTERNAL_FUNCTION 関数は拡張機能または Zend/PHP カーネルによって提供され、c/c++ で記述され、直接実行できます。内部関数の構造は次のとおりです
。 リーリーモジュールが初期化されると、ZE はロードされた各拡張モジュールを走査し、モジュール内の function_entry で指定された各関数 (module->functions) の zend_internal_function 構造体を作成し、そのタイプを ZEND_INTERNAL_FUNCTION に設定します。グローバル関数テーブル (HashTable 構造)、関数の設定と登録のプロセスについては、Zend/zene_API.c ファイルの zend_register_function 関数を参照してください。この関数は、関数ページの処理に加えて、これらのマジック メソッドを含むクラス メソッドも処理します。
内部関数の構造は基本的にユーザー定義関数の構造と似ていますが、いくつかの違いがあります:
callメソッド、handlerフィールド、それがZEND_INTERNAL_FUNCTIONの場合、ZENDはzend_execute_internalを呼び出し、zend_internal_function.handlerを通じてこの関数を実行します。ユーザー定義関数は中間コードを生成し、その中間コードを呼び出される相対メソッドにマップする必要があります。
3. 変数関数 変数名の後に括弧がある場合、PHPは変数の値と同じ名前の関数を探して実行しようとします。
変数関数$func
リーリーコンパイルされた中間コード
リーリー内部機能
リーリーコンパイルされた中間コード
リーリー比較すると、中間コードの呼び出しが変数関数が DO_FCALL_BY_NAME であるのに対し、内部関数は DO_FCALL であることがわかります。これは構文解析中にすでに決定されています。 Zend/zend_complie.c ファイルの zend_do_end_function_call 関数のコードの一部を参照してください。 リーリー
メソッドではなく動的に呼び出されず、関数名が文字列変数の場合、生成される中間コードは ZEND_DO_FCALL になります。それ以外の場合は、ZEND_DO_FCALL_BY_NAME です。また、変数関数はコールバック関数として使用され、その処理プロセスは Zend/zend_complie.c ファイルの zend_do_pass_param 関数内にあり、最終的に中間コードの実行時に ZEND_SEND_VAL_SPEC_CONST_HADNLER などの関数に反映されます。
4. 匿名関数
匿名関数は、識別子を指定せずに呼び出すことができる関数またはサブルーチンの一種で、他の関数にパラメータとして渡すことができます。
http://www.bkjia.com/PHPjc/1099824.html