Home >Backend Development >PHP Tutorial >PHP7 Kernel Analysis 6 Functions

PHP7 Kernel Analysis 6 Functions

不言
不言Original
2018-04-13 15:06:271553browse

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

PHP7 Kernel Analysis 6 Functions

##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 parameter
//参数的额外信息
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;
All 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]


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.
//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;
Related recommendations:

PHP7 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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn