PHP扩展函数返回的值为NULL

时间:2011-06-25 09:29:47

标签: php php-extension

我在开发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)

这个值未能从扩展程序中正确传递的原因是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

您获得的是NULL,因为debug_zval_dump()具有内置回显功能,您无法将回声设置为变量。所以你的$ v = foo()实际上是给你$ v =“”。您为空变量获取2的引用计数的原因是由于固有的PHP优化。

在此处阅读:http://us3.php.net/manual/en/function.debug-zval-dump.php

所以要正确地返回你的价值,你可以:

  1. 通过将echo写入缓冲区来抑制内置回显
  2. 将缓冲区结果设置为变量
  3. 对该(非NULL)变量
  4. 运行第二个debug_zval_dump()

    以下是它的工作原理:

    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**