【问题标题】: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_methodzend_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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2012-04-17
      • 2011-02-27
      • 1970-01-01
      • 2021-06-16
      • 2019-11-12
      相关资源
      最近更新 更多