PHP:通过引用传递的变量的替代方案?

时间:2009-12-15 06:37:01

标签: php

在分钟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;

3 个答案:

答案 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'

希望有所帮助!