2012-04-22 40 views
2

通過引用傳遞:PHP:按引用傳遞

<?php 
$str = "test \n"; 
trim(&$str); 
echo "-" . "$str" . "-"; 
?> 

輸出爲:

-test 
- 

但是當我做

<?php 
$str = "test \n"; 
$str = trim($str); 
echo "-" . "$str" . "-"; 
?> 

輸出爲:

-test- 

爲什麼我不能通過引用來傳遞?

回答

8

因爲trim()不期望的參考,因此不修改傳遞給它的字符串。經過參考纔有意義,如果該函數需要一個 - 然後你沒有的傳遞,因爲如果函數定義包含引用參數或沒有什麼重要的參考選擇。

你正在嘗試做的,在調用的時候傳址引用deprecated在PHP中,因爲很長一段時間。除此之外,即使它不會被棄用,將只對實際修改參數的函數工作。

注:函數調用中沒有參考符號 - 僅在函數定義上。單獨的函數定義足以通過引用正確傳遞參數。從PHP 5.3.0開始,當您在foo(&$a);中使用&時,您將收到一條警告,指出「呼叫時傳遞參考」已棄用。

+0

爲什麼他們不贊成使用PHP? – dukevin 2012-04-22 10:34:10

+3

因爲它根本沒有意義。爲了使CTPBR有用,調用者需要知道函數的實現細節。取決於函數的寫法,甚至可能會有意想不到的副作用。 – ThiefMaster 2012-04-22 10:35:43

1

讓檢查什麼PHP Reference說一下:

注:有一個函數調用無符號 - 只有函數定義。單獨的函數定義足以通過引用正確傳遞參數。由於PHP 5.3.0中,你會得到一個警告說「通話時傳遞的引用」已經過時......

看那trim簽名:

string trim (string $str [, string $charlist ]) 

沒有什麼約$str將通過引用傳遞。所以它不會。函數trim將僅使用您的輸入來生成輸出,但不會修改它 - 它不能反正,因爲$str未通過引用傳遞。