【PHP7内核剖析】——PHP 函数

今天看一下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来执行的,因此,内部函数执行的效率是远远高于用户自定义函数的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值