2009-12-15 110 views
0

在分钟php6 developer meeting中,我遇到了一个观点,它表示在PHP6中不再存在通过引用传递呼叫的时间。例如,以下都为PHP6是不正确的:PHP:通过引用传递变量的替代方法?

<?php 
$foo =& new StdClass(); 
?> 

<?php 
function &foo() 
{ 
    return new StdClass(); 
} 

$f = foo(); 
?> 

如果我们不能在PHP6是这样的:

$foo =& new StdClass(); 

什么是替代的是,有没有什么办法来模仿?

编辑:

答有关PHP6变量,我们可以做什么,对于变量,例如:

$this->data =& $_SESSION; 

回答

4

你不参数作为参考,但你仍然可以/必须声明您的功能/方法为通过参考接收参数。

也就是说,你不这样做(通过引用传递参数)

my_function(& $my_var); 

function my_function($a) { 
    // ... 
} 

但你可以做到这一点(声明函数作为参照接收参数)

my_function($my_var); 

function my_function(& $a) { 
    // ... 
} 


And ...您给出的代码示例与呼叫时间传递无关,但涉及归还

对于第二件事,如果你只是删除&?在函数内部创建的对象的实例将被返回,您仍然可以使用它,不是吗?

+0

谢谢您的回答,PLZ看到我的编辑下面的问题,谢谢 – Sarfraz 2009-12-15 07:22:27

+0

也是我说的不是功能,我说的呼叫时间传递通过引用。 – Sarfraz 2009-12-15 07:27:21

+1

通话时传递的引用*为*做功能。 '创建my_function(&$a);'是'传递$了''要通过参考在呼叫时my_function',而不是在声明时 – DMI 2009-12-15 07:32:53

4

对象总是通过引用自PHP5通过,所以这样的:

$foo =& new StdClass(); 

相同:

$foo = new StdClass(); 

+0

感谢您的回答,请参阅我的编辑问题,谢谢 – Sarfraz 2009-12-15 07:21:54

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' 

希望帮助!