The content of this article is about the functions of PHP7 kernel analysis 6. Now I share it with you. Friends in need can refer to it
1. The storage structure of the function
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
##The function_table attribute of EG is a hash table, which records all the functions in PHP
2. Function parameters
The function parameters are actually the same as the local variables within the function in terms of kernel implementation. When the function is called, the value of the parameter will first be copied at the calling location. Go to the respective positions of each parameterAll the above parameter results are saved in the zend_op_array.arg_info array. If the function declares a return value type, a zend_arg_info will also be created for it. This structure is in the first position of the arg_info array. , in this case zend_op_array->arg_info actually points to the second position of the array, and the structure of the return value is read through zend_op_array->arg_info[-1]//参数的额外信息 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;Copy after login
3. Internal functions
Internal functions refer to functions written in C language provided by the kernel and extensions. Such functions do not need to go through the opcode compilation process, so they are more efficient. Higher than PHP user-defined functions, there is no difference from ordinary C programs when called. The Zend engine defines many internal functions for users to use in PHP, such as: define, defined, strlen, method_exists, class_exists, function_exists...etc., in addition to the internal functions defined in the Zend engine, PHP extensions also A large number of internal functions are provided, and we can also flexibly customize it through extensions.Related recommendations://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;Copy after loginPHP7 Kernel Analysis 5-Compilation of PHP Code
PHP7 Kernel Analysis 4-Local Variables, Global Variables , Constant
PHP7 Kernel Analysis 3 Variables
The above is the detailed content of PHP7 Kernel Analysis 6 Functions. For more information, please follow other related articles on the PHP Chinese website!