background image

        zend_uchar type;  /* never used */
        char *function_name;
        zend_class_entry *scope;
        zend_uint fn_flags;
        union _zend_function *prototype;
        zend_uint num_args;
        zend_uint required_num_args;
        zend_arg_info *arg_info;
        zend_bool pass_rest_by_reference;
        unsigned char return_reference;
    } common;
 
    zend_op_array op_array;
    zend_internal_function internal_function;
} zend_function;
 
typedef struct _zend_function_state {
    HashTable *function_symbol_table;
    zend_function *function;
    void *reserved[ZEND_MAX_RESERVED_RESOURCES];
} zend_function_state;
其中 type 标明了函数的类型:用户函数、内置函数、重载函数。Common 中包含函数的

基本信息,包括函数名,

参数信息,函数标志(普通函数、静态方法、抽象方法)等内容。另外,对于用户函数,

还有一个函数符号表,

 

记录了内部变量等,这个将在后面详述。 Zend 维护了一个全局 function_table,这是

一个大的 hahs 表。

函数调用的时候会首先根据函数名从表中找到对应的 zend_function。当进行函数调用

时候,虚拟机会

根据 type

 

 

的不同决定调用方法, 不同类型的函数,其执行原理是不相同的 。

内置函数

内置函数,其本质上就是真正的 c 函数,每一个内置函数,php 在最终编译后都会展

开 成 为 一 个 名 叫 zif_xxxx 的 function , 比 如 我 们 常 见 的 sprintf , 对 应 到 底 层 就 是

zif_sprintf。Zend 在执行的时候,如果发现是内置函数,则只是简单的做一个转发操作。

Zend 提供了一系列的 api 供调用,包括参数获取、数组操作、内存分配等。内置函数的