2011-03-23 61 views

回答

3

在其他语言中引用(或指针)调用的一个常见原因是为了节省空间 - 但PHP足够聪明,可以实现写入时复制,这些参数被声明为按值传递(副本) 。还有一些隐藏的语义怪异 - 尽管PHP5引入了总是通过引用传递对象的做法,但数组值始终作为引用存储,call_user_func()始终通过值调用 - 从不通过引用(因为它本身是一个函数 - 不是构造)。

但这是对原始问题的补充。

一般而言,它总是将其代码声明为传值(复制),除非您在调用的功能返回后显式地要求该值不同。原因是您应该知道被调用的功能如何更改您当前正在编写的代码的状态。这些概念通常被称为孤立和关注的分离。

+1

+ 1为写复制行,这是关于传递数据和内存中发生的事情的一个很好的观点。 – RobertPitt 2011-03-23 11:36:13

2

由于PHP 5没有真正的理由通过引用传递值。

一个例外是如果你想在原地修改数组。以例如sort函数为例。您可以看到该数组是通过引用传递的,这意味着该数组就地排序(不返回新数组)。

或者考虑一个递归函数,其中每个调用都需要访问相同的数据(它通常也是一个数组)。

+0

-1:非常不同意这个答案。 – symcbean 2011-03-23 11:18:39

+1

@symcbean:小心解释为什么? – 2011-03-23 11:49:51

+0

@symcbean - 我也想知道 – Hacker 2011-03-23 11:55:12

0

在php4中,它被用于大型变量。如果你在一个函数中传递了一个数组,那么该数组就被复制用于该函数中,并使用大量的内存和cpu。解决方案是这样的:

function foo(&$arr) 
{ 
    echo $arr['value']; 
} 
$arr = new array(); 
foo($arr); 

这样你只传递参考,链接到数组并保存内存和cpu。由于php5的每个对象和数组(不知道像int这样的标量)是否通过内部引用传递,所以不需要自己做任何事情。

0

这是最好的,当你的函数总是返回传递给它同一个变量

 
$var = modify($var); 
function modify($var) 
{ 
return $var.'ret'; 
} 

如果你总是会返回传递变量的变量的修改版本,使用的参考是伟大的。

另外,当处理大的变量,特别是数组时,在可行的情况下通过引用是很好的。这有助于节省内存。

通常,我在处理数组时通过引用传递,因为我通常将修改后的数组返回到原始数组。