引用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 中的对象参数已经通过引用传递,您无需在它们之前添加"&"。