【问题标题】:reference issue when call_user_func_array call an self-made extension functioncall_user_func_array 调用自制扩展函数时的参考问题
【发布时间】:2012-08-23 16:01:53
【问题描述】:

我的php版本是5.2.17 我做了一个php函数

PHP_FUNCTION(GetProductFamily)
{
zval *productFamily;
int ret;

if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z",&productFamily) == FAILURE)
{
return;
}

productFamily->value.lval = 1;
RETURN_LONG(WS_OK);
}

$productFamily 被传入这个函数,它的值会被改变。

那么在php中,我只要调用这个函数就可以了:

<?php
$productFamily=0;
GetProductFamily(&$productFamily);
echo $productFamily;
?>
return 1;

or without &

<?php
$productFamily=0;
GetProductFamily($productFamily);
echo $productFamily;
?>
still return 1.

但是当我使用 call_user_func_array 调用这个函数时,事情变得很奇怪

<?php
  $productFamily = 0;
call_user_func_array('GetProductFamily', array(&$productFamily));
echo $productFamily; //return 0, should be 1 !
?>

然而

<?php
  $productFamily = 0;
call_user_func_array('GetProductFamily', array($productFamily));
echo $productFamily; //return 1 this time...
?>

因为 GetProductFamily 可以更改 $productFamily,所以我想我们必须在这里通过引用,但正如您所见,& 不起作用.... 我很困惑,因为当涉及到PHP提供的一些基本功能时,需要&!

<?php
$array = array("ab","cd");
call_user_func_array("array_shift", array(&$array));
var_dump($array); //return array("cd");
?>
means
<?php
$array = array("ab","cd");
call_user_func_array("array_shift", array($array));
var_dump($array); //return array("ab","cd");
?>

为什么??

【问题讨论】:

    标签: php reference


    【解决方案1】:

    只有在内部函数中才需要“&” 在扩展时,zval 似乎已经为你做了一切

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多