【问题标题】:Why does the error "expected to be a reference, value given" appear?为什么会出现“expected to be a reference, value given”的错误?
【发布时间】:2011-04-07 22:05:44
【问题描述】:

当我尝试通过引用调用带有参数的函数时它会触发

function test(&$a) ...

通过

call_user_func('test', $b);

【问题讨论】:

    标签: php


    【解决方案1】:

    call_user_func 只能按值传递参数,不能按引用传递。如果你想通过引用传递,你需要直接调用函数,或者使用call_user_func_array,它接受引用(但是这可能在PHP 5.3及更高版本中不起作用,取决于手册的哪一部分)。

    【讨论】:

    • @Artefacto 我最初忽略了这一点,因为手册指出 5.3 中不是这种情况,但我已经更新了我的答案。
    • 我会直接调用它,因为我刚刚遇到一个脚本在我的服务器上使用“call_user_func_array”可以正常工作但对于我的客户端它会引发错误(我使用的是 5.3.x 和他一定也是)......所以看起来有点摸不着头脑。
    • ReflectionMethod 类似:invoke 不起作用,而 invokeArgs 确实通过了引用。
    【解决方案2】:

    来自call_user_func()的手册

    注意 call_user_func() 的参数不是通过引用传递的。

    所以,是的,这就是你的答案。不过,有办法绕过它,再次阅读manual

    call_user_func_array('test', array(&$b));
    

    应该可以通过引用传递。

    【讨论】:

    • 但是,根据手册,该解决方法仅适用于 PHP 5.3 之前。
    • 是的,确实如此,因此最好避免使用该方法,因为它不会向前兼容。
    • >注意这不适用于 PHP > 5.3.0,因此请谨慎使用。但是我只是在 PHP 5.3.3 上进行了尝试,它在没有任何警告/通知的情况下工作。它似乎 call_user_func_array 隐藏错误。
    • 我做到了,但还有一个关于使用 call_user_func_array('test', array(&$b)); 的问题与 5.3。手册说这是不允许的,但实际上我看到了反对意见。
    【解决方案3】:

    我刚刚遇到了同样的问题,正在改变(就我而言):

    $result = call_user_func($this->_eventHandler[$handlerName][$i], $this, $event);
    

    $result = call_user_func($this->_eventHandler[$handlerName][$i], &$this, &$event);
    

    似乎在 php 5.3 中工作得很好。

    我认为这甚至不是一种解决方法,它只是在做被告知的事情:-)

    【讨论】:

    • 不推荐使用的方法。
    【解决方案4】:

    你需要设置变量等于函数的结果,像这样...

    $b = call_user_func('test', $b);
    

    而函数应该写成如下...

    function test($a) {
        ...
        return $a
    }
    

    不推荐使用其他按参考传递的工作。

    【讨论】:

      【解决方案5】:

      您可以考虑在“使用”声明中包含一个引用变量的闭包概念。例如:

      $note = 'before';
      $cbl = function( $msg ) use ( &$note )
      {
          echo "Inside callable with $note and $msg\n";
          $note = "$msg has been noted";
      };
      call_user_func( $cbl, 'after' );
      echo "$note\n";
      

      解决您的原始问题的一些方法,但如果您有一个需要通过引用调用的函数,您可以在其周围包装一个可调用闭包,然后通过 call_user_func() 执行该闭包。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-11
        • 2015-01-20
        • 2022-11-01
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多