本文所用 php 源码版本为 7.1.33
在 php 源码目录下的 main/php.h 头文件中定义了宏 PHP_FUNCTION,
我们经常使用的 php 函数就是她来定义的,

从上图中可以看到该宏定义为 ZEND_FUNCTION,
而 ZEND_FUNCTION 定义在 Zend/zend_api.h 头文件中,

在 C 语言宏定义中的 ## 代表连接在其左右的字符串。
由上图中可以看到该宏的定义最终落在宏 INTERNAL_FUNCTION_PARAMETERS 上,

其中,zend_execute_data 为结构体 _zend_execute_data 的别名,见下图,

结构体 _zend_execute_data 的定义见下图,

以我们常用的 bcmath 扩展中的 bcadd 函数(ext/bcmath/bcmath.c)为例,
在编译阶段 PHP_FUNCTION(bcadd) 会被替换为
void zif_bcadd(zend_execute_data *execute_data, zval *return_value)

本文探讨的是PHP 7.1.33版本的源码,重点关注宏PHP_FUNCTION的作用。这个宏在main/php.h中定义,用于创建PHP函数。它通过C语言的宏展开,结合Zend/zend_api.h中的其它定义,如ZEND_FN,实现函数的声明。结构体zif_struct在宏的展开过程中扮演关键角色,它在编译时被用于扩展如bcmath扩展中的bc_add函数。
775

被折叠的 条评论
为什么被折叠?



