在分钟php6 developer meeting中,我遇到了一个问题,即在PHP6中不再存在调用时间传递引用。例如,以下两者对PHP6都不正确:
<?php
$foo =& new StdClass();
?>
<?php
function &foo()
{
return new StdClass();
}
$f = foo();
?>
如果我们不能在PHP6中使用这样的东西:
$foo =& new StdClass();
有什么替代方案,有什么办法可以模仿吗?
修改
回答PHP6中的变量,我们可以为变量做到这一点,例如:
$this->data =& $_SESSION;
答案 0 :(得分:4)
您没有通过引用传递参数,但您仍然可以/必须通过引用将您的函数/方法声明为接收参数。
即,你不这样做(通过引用传递参数):
my_function(& $my_var);
function my_function($a) {
// ...
}
但你可以这样做(通过引用将该函数声明为接收参数):
my_function($my_var);
function my_function(& $a) {
// ...
}
并且...您提供的代码示例与 call-time-pass-by-reference 无关,但与按引用返回相关。
对于第二件事,如果你只删除&
怎么办?将返回在函数内创建的对象的实例,您仍然可以使用它,不是吗?
答案 1 :(得分:4)
自PHP5起,对象总是通过引用传递,所以这个:
$foo =& new StdClass();
与:
相同$foo = new StdClass();
答案 2 :(得分:1)
回答PHP6中的变量,我们可以为变量做到这一点,例如:
$this->data =& $_SESSION;
我认为没有理由不这样做 - PHP不会删除引用,因为它们太有用了。没有其他方法可以创建对变量的引用。
呼叫时间传递引用已被弃用了一段时间。它只是意味着而不是这样做:
function foo($a) { return ++$a; }
foo(&$my_a);
你会这样做:
function foo(&$a) { return ++$a; }
foo($my_a);
这样可以使编程风格更清晰,更易于理解,并且还可以确保变量始终在您预期时引用,而不是在您不期望时引用。
处理对象是一种特殊情况 - 它们总是通过引用传递,模拟传值的唯一方法是使用clone
:
$a = new StdClass();
$a->foo = 'bar';
$b = $a;
$a->foo = 'qux';
// $b->foo is 'qux' too
$a = new StdClass();
$a->foo = 'bar';
$b = clone $a;
$a->foo = 'qux';
// $a->foo is 'qux' but $b->foo is 'bar'
希望有所帮助!