【问题标题】:PHP zend_call_method with arguments passed by referencePHP zend_call_method 通过引用传递参数
【发布时间】:2020-04-13 15:30:07
【问题描述】:

我目前正在将我们的 PHP 扩展从 PHP5 重写为 PHP7。为了从我们的 C/C++ 代码中调用 PHP 方法,我们使用来自 Zend/zend_interfaces.c 的稍微修改的 zend_call_method(使用比 2 个更多的参数)。现在我发现它不适用于通过引用传递的参数,

public function FuncWithRef(array &$changeThis)

如果它们在 PHP 代码中被更改,那么 C 部分中的 zval 值不会受到影响。在 PHP5 中,该值按预期被覆盖,以后可以在 C 代码中使用。

以前,用于函数调用的zend_fcall_info 结构由简单地填充参数

params[0] = &arg1;

在 PHP7 中改为

ZVAL_COPY_VALUE(&params[0], arg1);

函数执行后(zend_call_functionfci.paramsarg1 仍然包含原始 zval 值,PHP 代码中的更改不可用。我尝试了使用 DUP 而不是 COPY 之类的方法,但没有结果。有什么办法可以解决这个问题吗?我主要是在 PHP/ext 文件夹中搜索和比较代码 sn-ps 以了解从 PHP5 到 PHP7 是如何重写的,这似乎是我希望的最后一部分。

【问题讨论】:

    标签: php c php-extension


    【解决方案1】:

    zend_call_method 中 PHP5 和 PHP7 方法的两个区别:

    fci.no_separation = 0;
    

    必须设置。然后 fci.params 在 zend_call_function 中被更改,然后必须手动将它们复制回 zend_call_method 输入参数。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2010-10-07
      • 2011-08-21
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多