Le contenu de cet article présente les fonctions d'analyse du noyau PHP7 6. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
1. >
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_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
L'attribut function_table d'EG est une table de hachage, qui enregistre toutes les fonctions en PHP
2. Paramètres de fonction
Les paramètres de fonction dans l'implémentation du noyau sont en fait les mêmes que les variables locales dans la fonction. Lorsque la fonction est appelée, elle le sera. soyez d'abord à l'emplacement appelant Copiez la valeur du paramètre à l'emplacement respectif de chaque paramètre//参数的额外信息 typedef struct _zend_arg_info { zend_string *name; //参数名 zend_string *class_name; zend_uchar type_hint; //显式声明的参数类型,比如(array $param_1) zend_uchar pass_by_reference; //是否引用传参,参数前加&的这个值就是1 zend_bool allow_null; //是否允许为NULL zend_bool is_variadic; //是否为可变参数,即...用法,function my_func($a, ...$b){...} } zend_arg_info;
3. Fonctions internes
Les fonctions internes font référence aux fonctions écrites en langage C fournies. par le noyau et les extensions. De telles fonctions n'ont pas besoin de passer par le processus de compilation d'opcode, donc l'efficacité est supérieure à celle des fonctions PHP définies par l'utilisateur, et il n'y a aucune différence avec les programmes C ordinaires lorsqu'ils sont appelés. Le moteur Zend définit de nombreuses fonctions internes que les utilisateurs peuvent utiliser en PHP, telles que : définir, défini, strlen, method_exists, class_exists, function_exists...etc., en plus des fonctions internes définies dans le moteur Zend, des extensions PHP également A un grand nombre de fonctions internes sont fournies et nous pouvons également les personnaliser de manière flexible grâce à des extensions.//zend_internal_function头部是一个与zend_op_array完全相同的common结构 typedef struct _zend_internal_function { /* Common elements */ zend_uchar type; zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */ uint32_t fn_flags; zend_string* function_name; zend_class_entry *scope; zend_function *prototype; uint32_t num_args; uint32_t required_num_args; zend_internal_arg_info *arg_info; /* END of common elements */ void (*handler)(INTERNAL_FUNCTION_PARAMETERS); //函数指针,展开:void (*handler)(zend_execute_data *execute_data, zval *return_value) struct _zend_module_entry *module; void *reserved[ZEND_MAX_RESERVED_RESOURCES]; } zend_internal_function;
Analyse du noyau PHP7 5 - Compilation du code PHP
Analyse du noyau PHP7 4 - Variables locales, Variables globales, constantes
Analyse du noyau PHP7 3 variables
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!