ホームページ  >  記事  >  バックエンド開発  >  PHPカーネルの内部構造を深く理解する(5)関数、内部構造を深く理解する_PHPチュートリアル

PHPカーネルの内部構造を深く理解する(5)関数、内部構造を深く理解する_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:59:12788ブラウズ

PHPカーネルの内部構造の深い理解(5)関数、内部構造の深い理解

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

www.bkjia.com本当http://www.bkjia.com/PHPjc/1099824.html技術記事 PHP カーネルの内部構造の詳細な理解 (5) 関数の内部構造の詳細な理解には、ユーザー定義関数、内部関数 (print_r count...)、無名関数、変数関数 ($) が含まれます。ふ…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。