Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist eine PHP-Referenzrückgabe?

Was ist eine PHP-Referenzrückgabe?

伊谢尔伦
伊谢尔伦Original
2017-06-27 13:52:051135Durchsuche

Oft sehen wir Code wie diesen (aus dem CI-Framework-Quellcode):

$class =& load_class('a','b');

Wir alle wissen, dass sich das „&“ darin auf eine Referenz bezieht, aber welche Rolle spielt es? Welche Probleme kann es lösen? Mit diesen Fragen beginnen wir, „Referenzrendite“ zu verstehen.

Referenzrückgabe

Das Handbuch sagt Folgendes: Die Referenzrückgabe wird verwendet, wenn Sie eine Funktion verwenden möchten, um herauszufinden, an welche Variable die Referenz gebunden werden soll. Verwenden Sie keine Rückgabereferenzen, um die Leistung zu steigern. Die Engine ist intelligent genug, um sie selbst zu optimieren. Geben Sie Referenzen nur zurück, wenn ein triftiger technischer Grund vorliegt! Um eine Referenz zurückzugeben, verwenden Sie diese Syntax:

<?php
class foo {
    public $value = 42;
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
// $myValue is a reference to $obj->value, which is 42.
// $myValue 是 $obj->value 的引用,它们的值都是 42
$myValue = &$obj->getValue(); 
// 对 $obj->value 重新复制,会影响到 $myValue 的值
$obj->value = 2;
// prints the new value of $obj->value, i.e. 2.
echo $myValue; // 程序输出 2
?>

In diesem Beispiel wird der Eigenschaft des von der getValue()-Funktion zurückgegebenen Objekts ein Wert zugewiesen und nicht kopiert, genau wie ohne Referenzsyntax zu verwenden. Gleiches.

unterscheidet sich von der Parameterübergabe. Das kaufmännische Und muss hier an beiden Stellen verwendet werden – es zeigt an, dass eine Referenz anstelle einer üblichen Kopie zurückgegeben wird. Es zeigt auch an, dass $myValue als Referenz gebunden ist und nicht als gewöhnliche Abtretung.

Wenn Sie versuchen, eine Referenz von einer Funktion wie dieser zurückzugeben: return ($this->value);, funktioniert dies nicht, da Sie versuchen, das Ergebnis eines Ausdrucks anstelle einer referenzierten Variablen. Sie können Referenzvariablen nur von Funktionen zurückgeben, eine andere Möglichkeit gibt es nicht. Wenn Code versucht, einen dynamischen Ausdruck oder das Ergebnis des neuen Operators zurückzugeben, wird ab PHP 4.4.0 und PHP 5.1.0 ein E_NOTICE-Fehler ausgegeben.

Scheinen Sie zu verstehen, aber nicht zu verstehen? Schreiben wir also das Programm um und machen es zu einer regulären Funktion:

<?php
class foo {
    public $value = 42;
    public function getValue() {
        return $this->value;
    }
}
$obj = new foo;
$myValue = $obj->getValue(); 
$obj->value = 2;
echo $obj->value;  // 程序输出 2
echo $myValue; // 程序输出 42
?>
Jetzt können wir verstehen, dass „Referenzrückgabe verwendet wird, wenn Sie eine Funktion verwenden möchten, um herauszufinden, an welche Variable die Referenz gebunden werden soll.“ Das war's, die Funktion &getValue() bindet die Referenz an die Mitgliedsvariable $value. Normalerweise ist das von $obj = new foo; generierte $obj eine Kopie und seine Mitgliedsvariable $value hat keine „Alias“-Beziehung (Referenz) mit der Funktion getValue().

Sehen Sie sich das einfache Beispiel unten an und versuchen Sie, die Referenzrückgabe zu verstehen.

<?php
function &test()
{
// 声明一个静态变量
    static $b = 0;
    $b = $b+1;
    echo $b;
    return $b;
}
$a = test();//这条语句会输出 $b 的值为 1
$a = 5;
$a = test();//这条语句会输出 $b 的值为2
$a = &test();//这条语句会输出 $b 的值为3
$a = 5;
$a = test();//这条语句会输出 $b的值 为6
?>
Ergebnis der Programmausführung: 1236

Um es anhand des obigen Beispiels zu erklären, ruft $a = test() eine Funktion auf diese Weise auf und weist lediglich den Wert der Funktion $a zu . und alle Änderungen an $a wirken sich nicht auf $b in der Funktion aus.

Was den Aufruf der Funktion über $a = &test() betrifft, so besteht seine Funktion darin, die Speicheradresse der $b-Variablen in return $b auf die gleiche Stelle wie die Speicheradresse der $a-Variablen zu verweisen. Das heißt, der Effekt ist äquivalent zu ($a=&$b), sodass eine Änderung des Werts von $a auch den Wert von $b ändert. Nach der Ausführung von

$a = &test();    
$a = 5;
beträgt der Wert von $b also 5.

Noch ein Programmbeispiel zur Vertiefung des Verständnisses:

Das obige ist der detaillierte Inhalt vonWas ist eine PHP-Referenzrückgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn