2011-09-17 174 views
19

我試過Google搜索,試過PHP文檔,搜索了一個答案,但沒有找到任何滿意的。我正在閱讀一本書,其中作者使用了「參考迴歸」,但從未解釋過它是什麼。作者使用的代碼是返回參考PHP

function &getSchool() { 
    return $this->school; 
} 

有人可以用簡單的詞語來解釋這個概念的例子。

謝謝。

+1

的[PHP文檔(http://php.net/manual/en/language.references.return.php)是明確的答案這 - 一定要瀏覽所有「參考解釋」部分。 – Jon

+3

克蒙喬恩,我已經說過我已經通過了文檔,並承認我從那裏很不理解它。這就是我在這裏問的原因,如果你有任何版本的解釋,我將不勝感激:) –

+0

Jon提供的鏈接可以用例子來解釋它。 – xdazz

回答

28

假設你有這個類:

class Fruit { 
    private $color = "red"; 

    public function getColor() { 
     return $this->color; 
    } 

    public function &getColorByRef() { 
     return $this->color; 
    } 
} 

類有一個私有財產和兩個方法,讓你訪問它。一個按值返回(默認行爲),另一個按引用返回。兩者的區別在於:

  • 當使用第一種方法,你可以改變返回值以及這些變化不會的Fruit私有財產內體現,因爲你實際上是修改的一個副本財產的價值。
  • 當使用第二種方法,你實際上又回到一個別名Fruit::$color - 一個不同的名稱由您指的是同一個變量。所以如果你對它做任何事情(包括修改它的內容),你實際上是直接對屬性值進行相同的操作。

下面是一些代碼來測試它:

echo "\nTEST RUN 1:\n\n"; 
$fruit = new Fruit; 
$color = $fruit->getColor(); 
echo "Fruit's color is $color\n"; 
$color = "green"; // does nothing, but bear with me 
$color = $fruit->getColor(); 
echo "Fruit's color is $color\n"; 

echo "\nTEST RUN 2:\n\n"; 
$fruit = new Fruit; 
$color = &$fruit->getColorByRef(); // also need to put & here 
echo "Fruit's color is $color\n"; 
$color = "green"; // now this changes the actual property of $fruit 
$color = $fruit->getColor(); 
echo "Fruit's color is $color\n"; 

See it in action

警告:我覺得有必要一提的是引用,而他們確實有合法的用途,是該應該僅僅很少使用,只有當你已經仔細考慮過第一任何替代的功能之一。缺乏經驗的程序員傾向於過度使用引用,因爲他們發現他們可以幫助他們解決特定的問題,而不會同時看到使用引用的缺點(作爲高級功能,其細微差別遠不明顯)。

+0

Jon解釋得很好,謝謝:)。 –

+0

另一方面,文檔中的所有內容都是有效的,但是當接收端沒有提及&符時會發生什麼,以及如何禁用類中的值複製?例如。爲單身人士課程。因爲如果你必須指望主叫方表現良好,那麼知道你想要返回一個值並沒有多大意義,是嗎? – nus

3

您發佈的示例可能來自PHP4或更早版本。不再需要通過引用來返回對象,因爲它們幾乎總是以PHP5 +自動完成的。

當您想使用函數 找到引用應綁定到的變量時,通過引用返回很有用。請勿使用 通過引用返回來提高性能。引擎 自動自動優化。只有在 您有合理的技術理由才能返回參考。

return references in PHP docs

+0

我已經說過我已經通過文檔,並且這對我沒有任何解釋。我想更多地瞭解它。 –

+0

您是否閱讀過http://www.php.net/manual/en/language.references.php? – six8

+3

有幾種情況下,參考迴歸可能很好,但我是一個強大的對手。另見我的博客:http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html – johannes

14

簡單的規則:如果您在PHP函數名的前面放置一個&你可以使用&當你調用函數(即它的返回值),如果它是一個變量,而不是一個功能。

就是這樣。


更容易想到它是「PHP允許您引用返回值」,而不是PHP通過引用返回。如上所述,您只需放置一個&來告訴PHP你想要這個,如果你沒有放置它並嘗試去做$var =& somefunction(),你會得到錯誤「只能通過引用分配變量」。

解決Jon的答案有些困惑。實際上不需要有兩個單獨的函數,一個是引用返回,另一個是值返回;在一些項目公約之外。 &只有允許它通過引用返回,它不會強制它通過引用返回

例如。同樣的功能既用於參考和非參考分配

\header('content-type: text/plain'); 

class Demo 
{ 
    protected $example = 'original value'; 

    function & example() 
    { 
     return $this->example; 
    } 
} 

$demo = new Demo; 

#1 - pass by value 

$var1 = $demo->example(); 
$var1 = 'var1 value'; 

echo '$demo->example() => '.$demo->example().PHP_EOL; 
echo PHP_EOL; 

#2 - pass by reference 

$var2 =& $demo->example(); 
$var2 = 'var2 value'; 

echo '$demo->example() => '.$demo->example().PHP_EOL; 
echo '$var1 => '.$var1.PHP_EOL; 
echo '$var2 => '.$var2.PHP_EOL; 
echo PHP_EOL; 

#3 - altering other references 

$var3 =& $demo->example(); 
$var3 = 'var3 value'; 

echo '$demo->example() => '.$demo->example().PHP_EOL; 
echo '$var1 => '.$var1.PHP_EOL; 
echo '$var2 => '.$var2.PHP_EOL; 
echo '$var3 => '.$var3.PHP_EOL; 
echo PHP_EOL; 

exit; 

輸出

$demo->example() => original value 

$demo->example() => var2 value 
$var1 => var1 value 
$var2 => var2 value 

$demo->example() => var3 value 
$var1 => var1 value 
$var2 => var3 value 
$var3 => var3 value 

引用是巨大的但如果你不熟悉它們,請遵循以下規則:

  • 只有在處理大型數組或類似的非對象數據結構時才考慮使用引用
  • 從不引用對象(如果可以避免的話)
  • 只允許函數按引用傳遞(如果值在對象的靜態屬性或屬性中維護)它不是在函數內部臨時變量)

例外顯然是很功利的用途(即當你真正想要分享的值來簡化代碼操縱它)。

再次,NEVER引用對象(這是毫無意義!)