通过引用传递调用时间似乎在 PHP5.5 中有效



引用PHP参考手册,其中指出:

从 PHP 5.4.0 开始,调用时按引用传递被删除,因此使用它 将引发致命错误

然而,它似乎适用于 PHP 5.5 上的以下代码?

<?php
error_reporting(E_ALL);
class parentClass
{
    function _funcA()
    {
        var_dump($this);
    }
}
class childClass extends parentClass
{
    function funcA()
    {
        call_user_func_array(array(&$this, '_funcA'), array());
    }
}
$test = new childClass();
$test->funcA();

那么文档是错误的吗?还是文档没有提及一些特殊警告?当文档暗示它不应该这样做时,为什么这会起作用?

编辑:$this是一个对象的事实似乎并不重要,因为以下内容仍然会导致致命错误:

<?php
function f($v) { return $v->x++; }
$a = new StdClass();
$a->x = 1;
$b = f(&$a);
var_dump($a, $b);

在您的原始代码中,您没有通过引用call_user_func_array传递$this,它可能看起来像它,但事实并非如此。

您正在传入一个引用和字符串的数组,以及一个空数组。

所以你不是在传递对函数的引用,你只是传递了 2 个数组。

删除的东西是"调用时按引用传递",而不是"按引用传递"。

您仍然可以将引用传递给函数,但需要使用"&"定义函数参数。在函数调用时,不能在变量的"$"前使用"&",否则会导致警告(5.3)或错误(5.4)。

因此,上面的简单函数将像这样修复:

<?php
function f(&$v)        // '&' is added here
  { return $v->x++; }
$a = new StdClass();
$a->x = 1;
$b = f($a);            // '&' is removed here
var_dump($a, $b);

而且,在你的开始案例中,是一个不同的问题。 $this是指向类实例本身的指针,则"&$this"将具有相同的值。PHP5 中的对象参数已经通过引用传递,您无需在它们之前添加"&"。

最新更新