PhoneGap中文网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 80|回复: 0

php 的PHP_FUNCTION 宏详解

[复制链接]

87

主题

87

帖子

327

积分

中级会员

Rank: 3Rank: 3

积分
327
发表于 2017-8-10 15:34:05 | 显示全部楼层 |阅读模式
本文和大家分享的主要是phpPHP_FUNCTION 相关内容,一起来看看吧,希望对大家学习php有所帮助。
  作为 PHP程序员,我们几乎每天都在写函数,我们一定会好奇,那些 PHP 内置的函数,是长什么样子的。如果写过 PHP 扩展的话,一定知道这个宏: PHP_FUNCTION 。在定义一个函数的时候,这样来使用这个宏。例如 array_change_key_case ,它的定义是这样的: PHP_FUNCTION(array_change_key_case) 。没错,就是这么简单。但是,在这个简单的背后,却没有这么简单。
  PHP_FUNCTION 追根溯源
  
  相信对这篇文章感兴趣的同学,一定多少对 C 语言以及它的宏定义有一定的了解。如果没有,也不要紧,我这里来简单解释一下,什么是宏。
  C 语言中的宏,我认为,可以理解为一种简单的封装。通过宏定义,可以对开发者隐去一些细节,让开发者在使用简单的语法来完成重复的复杂的编码。当然,宏定义还有其它的用途,但是,我们在 PHP_FUNCTION 涉及到的就是这个作用。有下面的代码。
  #define TEST(test) void test(int a)
  TEST(haha)
  宏,就是完全的替换,即使用后面的语句替换前面的。那么对于下面的 TEST(haha) 就相当于下面的样子。
  void haha(int a)
  PHP_FUNCTION 的定义
  首先,我们要定义函数,这样使用这个宏。
  PHP_FUNCTION(array_change_key_case)
  {
  // TODO
  }
  我们在 php-src/main/php.h 中找到了下面的定义。
  #define PHP_FUNCTION ZEND_FUNCTION
  也就是说,这里用 ZEND_FUNCTION 替换了 PHP_FUNCTION 这个宏。所以,我们的定义就相当于变成了这样。
  ZEND_FUNCTION(array_change_key_case)
  {
  // TODO
  }
  我们继续往下找,因为,这里还是宏,我们并没有看到我们希望看到的代码。我们可以在 php-src/Zend/zend_API.h 中找到下面的定义。
  #define ZEND_FN(name) zif_##name
  #define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))
  #define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
  我们看到,在宏定义中,使用了另外的宏。不要怕,还是一个词,替换。我们按照这样的步骤来。( ## 是一个连接符,它的作用是,是将它前面的与后面的,按照字符串的方式连接起来。
  ZEND_FUNCTION
  ZEND_NAMED_FUNCTION(ZEND_FN(name))
  {
  // TODO
  }
  ZEND_FN
  ZEND_NAMED_FUNCTION(zif_array_change_key_case)
  {
  // TODO
  }
  ZEND_NAMED_FUNCTION
  void zif_array_change_key_case(INTERNAL_FUNCTION_PARAMETERS){
  // TODO
  }
  到这里,我们可以看到,这里已经基本和我们熟悉的函数定义差不多了,不过,这还没完,以为,这里还有宏,那就是 INTERNAL_FUNCTION_PARAMETERS 。我们找到 php-src/Zend/zend.h ,可以找到 INTERNAL_FUNCTION_PARAMETERS 的宏定义。
  #define INTERNAL_FUNCTION_PARAMETERS zend_execute_data *execute_data, zval *return_value
  好了,依然按照替换的原则,我们就可以将函数定义变成这样了。
  void zif_array_change_key_case(zend_execute_data *execute_data, zval *return_value){
  // TODO
  }
  看,整个函数的定义,已经完全没有宏了,这已经是我们在熟悉不过的 C 语言函数的定义了。这就是
  PHP_FUNCTION 的整个定义的过程。
  execute_data return_value
  return_value ,顾名思义,就是定义的 PHP 函数的返回值。而 execute_data ,按照我的理解,就是 Zend 内部的一个调用栈,而在执行这个函数的时候,指向的是这个函数的栈帧。具体的细节,暂时在这里先不考虑,有兴趣的同学可以来这里看一下。
来源:SegmentFault

it营
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|PhoneGap中文网 ( 京ICP备13027796号-1

GMT+8, 2017-10-22 03:22 , Processed in 0.202408 second(s), 32 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表