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 供调用,包括参数获取、数组操作、内存分配等。内置函数的