我目前正在将我们的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(¶ms[0], arg1);
函数执行(zend_call_function
(后,fci.params
和arg1
仍然包含原始的zval值,在PHP代码中所做的更改不可用。我尝试了使用 DUP 而不是 COPY 之类的方法,但没有结果。有什么办法可以解决这个问题吗?我主要搜索和比较 PHP/ext 文件夹中的代码片段,看看事情是如何从 PHP5 重写到 PHP7 的,这似乎是我缺少的最后一部分。
PHP5 和 PHP7 方法在zend_call_method中的两个区别:
fci.no_separation = 0;
必须设置。然后在zend_call_function内部更改 fci.params,然后必须手动将它们复制回zend_call_method输入参数。