2011-03-23 83 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'; 
} 

如果你總是會返回傳遞變量的變量的修改版本,使用的參考是偉大的。

另外,當處理大的變量,特別是數組時,在可行的情況下通過引用是很好的。這有助於節省內存。

通常,我在處理數組時通過引用傳遞,因爲我通常將修改後的數組返回到原始數組。