簡體   English   中英

在PHP中通過引用返回

[英]Return by reference in PHP

我嘗試了谷歌搜索,嘗試了PHP文檔,搜索了Stack Overflow的答案,但找不到任何令人滿意的答案。 我正在讀一本書,其中作者使用了Return by Reference,但從未解釋過它是什么。 作者使用的代碼是

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

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

假設你有這個類:

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"; 

看到它在行動

警告:我覺得有必要提一下,雖然它們確實具有合法用途,但它們之一是應該很少使用的功能之一, 並且只有在您首先仔細考慮過任何替代方案時才能使用 經驗不足的程序員傾向於過度使用引用,因為他們看到他們可以幫助他們解決特定問題,而不會同時看到使用引用的缺點(作為一個高級功能,其細微差別遠非顯而易見)。

簡單的規則 :如果你在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

參考文獻很棒,但如果您不熟悉它們,請遵循以下規則:

  • 如果您正在處理大型數組或類似的非對象數據結構,則只考慮使用引用
  • 永遠不要引用一個對象(如果可以避免它)
  • 如果值保存在對象的靜態屬性或屬性中,則只允許函數通過引用傳遞(即,它不是函數內的臨時變量)

例外顯然是非常實用的用法(即當你真的想要共享一個值來簡化操作它的代碼時)。

再次, 從來沒有參考對象 (這是毫無意義的!)

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

當您想要使用函數來查找引用應該綁定到哪個變量時,通過引用返回很有用。 不要使用按引用返回來提高性能。 引擎將自動對其進行自動優化。 只有在有正當技術理由的情況下才返回引用。

請參閱PHP文檔中的返回引用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM