今天看一下PHP7中的函数相关的一点儿知识。
首先来说,PHP的函数分为用户自定义函数与内部函数两类,先看一下用户自定义函数。
通过前面的文章,我们知道了PHP在编译执行的时候,会将PHP脚本解释称opline指令。那同样的,PHP中函数也是被编译成了opline指令集合zend_op_array。调用函数时即相当于调用指令集。PHP脚本通过_zend_function联合体来定义一个函数:
union _zend_function {
zend_uchar type; /* MUST be the first element of this struct! */
struct {
zend_uchar type; /* never used */
zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
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_internal_function internal_function;
};
上面的union中,type用来区别函数类型,common用来存放函数的名称,参数等信息。
再来看一下PHP的内部函数。内部函数的结构不是zend_op_array,而是zend_internal_function。看一下它的结构:
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);
struct _zend_module_entry *module;
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
} zend_internal_function;
通过观察,我们可以看到,内部函数也有与用户自定义函数中的common完全一样的一个成员。而内部函数与用户自定义函数的区别是由common成员当中的type来区分的。
//内部函数
#define ZEND_INTERNAL_FUNCTION 1
//用户自定义函数
#define ZEND_USER_FUNCTION 2
内部函数与用户自定义函数的调用时一样的,但是他们的处理机制不同,调用普通函数时,是由执行器执行zned_op
_array->opcode,而内部函数是直接调用zend_internal_function->handle来执行的,因此,内部函数执行的效率是远远高于用户自定义函数的。