我在开发PHP扩展时偶然发现了一个有趣的案例。在扩展代码中我有:
PHP_FUNCTION(foo)
{
....
php_debug_zval_dump(return_value, 1);
}
在PHP代码中:
$v = foo();
debug_zval_dump($v);
运行上述内容时,我得到:
string(19) "Mouse configuration" refcount(1)
NULL refcount(2)
这个值未能从扩展程序中正确传递的原因是什么?
谢谢!
答案 0 :(得分:0)
您获得的是NULL,因为debug_zval_dump()具有内置回显功能,您无法将回声设置为变量。所以你的$ v = foo()实际上是给你$ v =“”。您为空变量获取2的引用计数的原因是由于固有的PHP优化。
在此处阅读:http://us3.php.net/manual/en/function.debug-zval-dump.php
所以要正确地返回你的价值,你可以:
以下是它的工作原理:
function myfunc($foo)
{
debug_zval_dump($foo, 1);
}
ob_start();
/*
starts the output buffer which will catch all code instead of echoing it to page
*/
myfunc('Mouse configuration');
$v = ob_get_contents();
/*
writes the buffer which contains your f(x) results to a var
*/
ob_end_clean();//clears the buffer
debug_zval_dump($v);//will echo non-null value
代码将以此结果:
string(65)“string(19)”鼠标配置“refcount(3)long(1)refcount(1)”refcount(2)
我不知道这段代码是做什么的,但无论如何都要好运。 :)
答案 1 :(得分:0)
这并不奇怪。
例如,如果您执行return_value = some_string_zval;
,则只会更改局部变量。 php_debug_zval_dump
会起作用,但在功能之外它不起作用。您必须主动复制zval,例如用:
ZVAL_COPY_VALUE(return_value, my_string_zval_p);
zval_copy_ctor(return_value);
只能复制指针而不是复制数据,从内部函数返回的唯一情况是该函数是否通过引用返回。在这种情况下,您将获得zval**
。