我試過Google搜索,試過PHP文檔,搜索了一個答案,但沒有找到任何滿意的。我正在閱讀一本書,其中作者使用了「參考迴歸」,但從未解釋過它是什麼。作者使用的代碼是返回參考PHP
function &getSchool() {
return $this->school;
}
有人可以用簡單的詞語來解釋這個概念的例子。
謝謝。
我試過Google搜索,試過PHP文檔,搜索了一個答案,但沒有找到任何滿意的。我正在閱讀一本書,其中作者使用了「參考迴歸」,但從未解釋過它是什麼。作者使用的代碼是返回參考PHP
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";
警告:我覺得有必要一提的是引用,而他們確實有合法的用途,是該應該僅僅很少使用,只有當你已經仔細考慮過第一任何替代的功能之一。缺乏經驗的程序員傾向於過度使用引用,因爲他們發現他們可以幫助他們解決特定的問題,而不會同時看到使用引用的缺點(作爲高級功能,其細微差別遠不明顯)。
Jon解釋得很好,謝謝:)。 –
另一方面,文檔中的所有內容都是有效的,但是當接收端沒有提及&符時會發生什麼,以及如何禁用類中的值複製?例如。爲單身人士課程。因爲如果你必須指望主叫方表現良好,那麼知道你想要返回一個值並沒有多大意義,是嗎? – nus
您發佈的示例可能來自PHP4或更早版本。不再需要通過引用來返回對象,因爲它們幾乎總是以PHP5 +自動完成的。
當您想使用函數 找到引用應綁定到的變量時,通過引用返回很有用。請勿使用 通過引用返回來提高性能。引擎 自動自動優化。只有在 您有合理的技術理由才能返回參考。
簡單的規則:如果您在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引用對象(這是毫無意義!)
的[PHP文檔(http://php.net/manual/en/language.references.return.php)是明確的答案這 - 一定要瀏覽所有「參考解釋」部分。 – Jon
克蒙喬恩,我已經說過我已經通過了文檔,並承認我從那裏很不理解它。這就是我在這裏問的原因,如果你有任何版本的解釋,我將不勝感激:) –
Jon提供的鏈接可以用例子來解釋它。 – xdazz