标签:io ar on 文件 cti 代码 ef as line
php函数分为:用户自定义函数、内置函数(c扩展)、伪函数(语言结构)
用户自定义函数:
typedef union _zend_function {
zend_uchar type; /* 如用户自定义则为 #define ZEND_USER_FUNCTION 2
MUST be the first element of this struct! */
struct {
zend_uchar type; /* never used */
char *function_name; //函数名称
zend_class_entry *scope; //函数所在的类作用域
zend_uint fn_flags; // 作为方法时的访问类型等,如ZEND_ACC_STATIC等
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;
zend_function的结构中的op_array存储了该函数中所有的操作,当函数被调用时,ZE就会将这个
op_array中的opline一条条顺次执行, 并将最后的返回值返回。 从VLD扩展中查看的关于函数的信息可以
看出,函数的定义和执行是分开的,每个函数可以作为一个独的运行单元而存在。
内部函数:
typedef struct _zend_internal_function {
/* Common elements */
zend_uchar type;
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;
/* END of common elements */
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
struct _zend_module_entry *module;
} zend_internal_function;
最常见的操作是在模块初始化时,ZE会遍历每个载入的扩展模块,然后将模块中function_entry中指明
的每一个函数(module->functions), 创建一个zend_internal_function结构, 并将其type设置为
ZEND_INTERNAL_FUNCTION,将这个结构填入全局的函数表(HashTable结构); 函数设置及注册过程见
Zend/zend_API.c文件中的 zend_register_functions函数。注意内部函数没有op array
内部函数的结构与用户自定义的函数结构基本类似,有一些不同,
调用方法,handler字段. 如果是ZEND_INTERNAL_FUNCTION, 那么ZE就调用
zend_execute_internal,通过zend_internal_function.handler来执行这个函数。 用户自定义的函
数需要?成中间代码,然后通过中间代码映射到相对就把方法调用。
内置函数在结构中多了一个module字段,表示属于哪个模块。不同的扩展其模块不同。
type字段,在用户自定义的函数中,type字段几乎无用,而内置函数中的type字段作为?种内部函数
的区分。
zend_function 与 zend_internal_function /zend_op_array 结构类似导致可以转换
标签:io ar on 文件 cti 代码 ef as line
原文地址:http://www.cnblogs.com/hike2008/p/php_function.html