PHP zend_call_method 参数通过引用传递
PHP zend_call_method with arguments passed by reference
我目前正在将 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;
必须设置。然后 fci.params 在 zend_call_function 中被更改,然后必须手动将它们复制回 zend_call_method 输入参数。
我目前正在将 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;
必须设置。然后 fci.params 在 zend_call_function 中被更改,然后必须手动将它们复制回 zend_call_method 输入参数。