【发布时间】: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_function)fci.params 和 arg1 仍然包含原始 zval 值,PHP 代码中的更改不可用。我尝试了使用 DUP 而不是 COPY 之类的方法,但没有结果。有什么办法可以解决这个问题吗?我主要是在 PHP/ext 文件夹中搜索和比较代码 sn-ps 以了解从 PHP5 到 PHP7 是如何重写的,这似乎是我希望的最后一部分。
【问题讨论】:
标签: php c php-extension