PHP7 カーネル解析 6 関数

不言
不言オリジナル
2018-04-13 15:06:271552ブラウズ

この記事の内容は、PHP7 カーネル解析 6 の関数に関するものです。必要な友達は参考にしてください。

1. 関数のストレージ構造EG の function_table 属性は、PHP のすべての関数を記録するハッシュ テーブルです

PHP7 カーネル解析 6 関数 2. 関数パラメータ

カーネル実装の関数パラメータは、実際には関数内のローカル変数と同じです。関数が呼び出されると、まずパラメータの値を呼び出し場所の各パラメータのそれぞれの場所にコピーします

typedef union  _zend_function        zend_function;

union _zend_function {
    zend_uchar type;    
    struct {
        zend_uchar type; 
        zend_uchar arg_flags[3];
        uint32_t fn_flags;
        zend_string *function_name;
        zend_class_entry *scope; //成员方法所属类,面向对象实现中用到
        union _zend_function *prototype;
        uint32_t num_args; //参数数量
        uint32_t required_num_args; //必传参数数量
        zend_arg_info *arg_info; //参数信息
    } common;
    zend_op_array op_array; //自定义函数(函数实际编译为普通的zend_op_array)
    zend_internal_function internal_function; //内部函数(通过扩展或者内核提供的C函数)
};

上記のパラメータの結果はすべて zend_op_array.arg_info 配列に保存されます。関数が戻り値の型を宣言している場合、この構造体は arg_info 配列内に作成されます。この場合、zend_op_array->arg_info は実際には配列の 2 番目の位置を指し、戻り値の構造体は zend_op_array を通じて読み取られます。 ->arg_info[-1]

3. 内部関数
内部関数は、カーネルお​​よび拡張機能によって提供される C 言語で記述された関数を指します。このような関数は、オペコードのコンパイル プロセスを経る必要はありません。したがって、呼び出されるときは、PHP ユーザー定義関数よりも効率的です。C プログラムとの違いはありません。 Zend エンジンは、ユーザーが PHP で使用できる多くの内部関数 (define、define、strlen、method_exists、class_exists、function_exists... など) を定義します。Zend エンジンで定義された内部関数に加えて、PHP 拡張機能も定義されています。内部機能も豊富に用意されており、拡張機能による柔軟なカスタマイズも可能です。

zend_function.common.xx快速访问到zend_function.zend_op_array.xx及zend_function.zend_internal_function.xx
zend_function.type取到zend_function.op_array.type及zend_function.internal_function.type

関連する推奨事項:

PHP7 カーネル分析 5 - PHP コードのコンパイル

PHP7 カーネル分析 4 - ローカル変数、グローバル変数、定数

PHP7 カーネル分析 3 - 変数

以上がPHP7 カーネル解析 6 関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。