Frage

Ich bekomme überall gemischte Signale.

Verwende ich das Ampersand, um Variablen durch Referenz zu übergeben oder nicht?

Der folgende Link scheint mir zu sagen, dass er veraltet und nicht mehr notwendig ist:
http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html

Aber Themen wie diese lassen mich wundern:
Call-Time Pass-by-Referenz veraltet?
PHP und Ampersanden

Lassen Sie mich meine Frage als Beispiel formulieren.

Wenn ich eine Funktion mache, verwendete PHP 5.5.5:

function recurring_mailer_form($form, $form_state) 
{

}

Ist es das gleiche wie:

function recurring_mailer_form($form, &$form_state) 
{

}

?

War es hilfreich?

Lösung

Der Grund, warum verschiedene Artikel unterschiedliche Dinge zu sagen scheinen, ist, dass sie über verschiedene Arten von Pass-by-Reference sprechen.

Die Hauptsache, die feststellt, ob ein Parameter mit Referenz übergeben werden sollte, ist die Funktionssignatur selbst, und die Grundlagen dieser dieser diese haben sich seit Php 4 nicht geändert. Betrachten Sie dieses Beispiel:

function foo( $by_value, &$by_reference ) { /* ... */ }

$a = 1; $b = 2;
foo( $a, $b );

Hier die äußere Variable $a wird nach Wert an die Funktion übergeben, als ob sie als zugewiesen wird als $by_value = $a; - Änderungen an $by_value kann nicht beeinflussen $a. Die Variable $b wird jedoch bestanden durch Bezugnahme; Genau wie eine Aufgabe des Formulars $by_reference =& $b; Dies bedeutet, dass eine Variable auf zwei Namen verwiesen wird, und jede Zuordnung zu einer wird als Zuordnung zu beiden fungiert.

Wenn Sie einen "gewöhnlichen" Wert (eine Zeichenfolge, Zahl oder ein Array) nach Wert bestehen, wird sein Wert nur in die neue Variable kopiert. Ab Php 5: Wenn Sie ein Objekt nach Wert bestehen, passiert etwas etwas anderes - der kopierte "Wert" ist nur ein Zeiger auf dasselbe Objekt. Das bedeutet, dass wenn $a waren ein Objekt, man konnte anrufen $by_value->some_property = 42; und $a->some_property wäre auch 42. Wenn Sie jedoch einen neuen Wert zugewiesen haben $by_value, es würde immer noch nicht beeinflussen $a.

Bis Php 5.4, da war ein extra Weg, um einen Parameter durch Bezugnahme zu übergeben, das das Referenzverhalten "erzwingen" sollte zur Anrufzeit. Dies bedeutete, dass Sie schreiben konnten foo(&$a, &$b); und "erfassen" Änderungen an $by_value im Inneren foo() Funktion. Es war im Allgemeinen eine schlechte Idee, sich darauf zu verlassen, und es wurde so entfernt. (Es landete in 5,4, weil es zur Entfernung in Php 6 bestimmt war, dieses Projekt wurde jedoch auf unbestimmte Halt gebracht, wobei die kleineren Änderungen in 5,3 und 5,4 landen).

Schließlich können Funktionen Rückkehr eine Variable durch Referenz (als im Handbuch hier besprochen). Dies ist ein wenig fummelig & in zwei Orte: Zu Beginn der Funktionserklärung, um das zu sagen return Sollte "diese Variablenreferenz zurückgeben" nicht "diesen Wert zurückgeben"; und im Code, der es aufruft, um dieser Referenz eine Variable zuzuweisen, anstatt nur ihren Wert zu kopieren. Hier ist ein dummes Beispiel, das einen Referenzparameter mit einer Referenzrendite kombiniert (die beiden müssen nicht zusammengehen, es ist nur ein Beispiel):

function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable, 
// but all those operations were by reference

Beachten Sie, dass viele Menschen fälschlicherweise glauben, dass die Übergabe einer Variablen durch Referenz einen Leistungsnutzen bietet, und dies war oft der einzige Grund für die Verwendung von Call-Time-Passing-für-Referenzen. Dies ist in der Regel falsch, da die Zend -Engine, die PHP versorgt Verweise. In der Tat, Referenzzuweisung im Allgemeinen Niederlagen Diese Optimierung aufgrund der Art und Weise, wie die Motors verfolgt, welche Variablen im Zustand des Kopierschreibens sind.

Andere Tipps

Nein ist es nicht.

  • Objekte werden immer automatisch als Referenzen übergeben (Referenzen (die Info! Weitere wichtige Informationen finden Sie unten!)

  • Deklarieren von Paramtern als Referenzen müssen bei der Funktionsdefinition auftreten:

    function test(&$var) {}
    

    Nicht Zum Zeitpunkt des Anrufs:

    // wrong
    $var = '123';
    test(&$var);
    


Wenn Sie wie gewohnt ein Objekt übergeben, können Sie den Zustand des Objekts (Eigenschaften) ändern.
Annehmen, dass $obj ist eine Instanz der Klasse TestClass die eine Mitgliedsvariable enthält, die genannt wird hello (Klicken Sie hier, um ein vollständiges Beispiel unter ideone.com zu erhalten):

function modify($obj) { $obj->hello = 'world (modified)!'; }

$obj->hello = 'world';
modify($obj);
var_dump($obj->hello);  // outputs "world (modified!)"

Dies sollte selbsterklärend sein. Verwenden Sie nun denselben Code, aber zuweisen einen anderen Wert an einen anderen Wert $obj Stattdessen führt die Änderung des Zustands des Objekts zu einer Änderung (keine Änderung (→ ideone.com):

function modify($obj) { $obj = 42; }
// ...
var_dump($obj->hello);  // outputs "world"

Wenn wir den Parameter nur als Referenz explizit akzeptieren, können wir den Inhalt der Variablen vollständig ändern (→ ideone.com):

function modify(&$obj) { $obj = 42; }
// ...
var_dump($obj);         // outputs "42"

Nein, das sind nicht gleich. PHP 5.4+ erkennt nur auf den Anruf, ob Referenz erforderlich ist, wenn die Funktion aufgerufen wird, indem die Deklaration überprüft wird.

Nein, nicht veraltet, da Sie den Referenzbetreiber in der Funktionserklärung benötigen, wenn dies Ihre beabsichtigte Verwendung ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top