【问题标题】:Are `zval *retval` argument and the `zval *` return value of the `zend_call_method` the same?`zval *retval` 参数和 `zend_call_method` 的 `zval *` 返回值一样吗?
【发布时间】:2020-09-09 13:00:09
【问题描述】:
zend api方法zend_call_method返回的zval *值和传入的zval *retval参数一样吗?
我可以看到zend_call_method 在zend_interfaces.h 中声明。我尝试 grepping 源目录的定义,但找不到它。它是在哪里定义的?
我见过一些扩展使用与retval 参数相同的变量,并且还接收函数调用的返回值。这是预期的用法吗?
【问题讨论】:
标签:
c
php-internals
zend-api
【解决方案1】:
我才发现它们不一样。
当使用zend_call_method 调用DateTime::setTimezone 时,将原始DateTime 对象的zval * 传递为*retval 会将其引用计数增加1。
zend_call_method_with_1_params(date, php_date_get_date_ce(), NULL, "settimezone", date, tz);
而下面的代码没有
date = zend_call_method_with_1_params(date, php_date_get_date_ce(), NULL, "settimezone", NULL, tz);