Muss ich das kaufmännische Und in PHP 5.5.X und höher verwenden?

8

Ich bekomme überall gemischte Signale.

Benütze ich das Und-Zeichen, um Variablen als Referenz zu übergeben oder nicht?

Der folgende Link scheint mir zu sagen, dass er veraltet ist und nicht mehr benötigt wird:
Ссылка

Aber Threads wie diese fragen mich:
Call-Time-Pass-by -Reference veraltet?
PHP und kaufmännisches Und-Zeichen

Lassen Sie mich meine Frage als Beispiel formulieren.

Wenn ich eine Funktion mache, benutze PHP 5.5.5:

%Vor%

Ist es das gleiche wie:

%Vor%

?

    
Nathan Lutterman 07.11.2013, 22:14
quelle

3 Antworten

22

Der Grund, warum verschiedene Artikel unterschiedliche Dinge zu sagen scheinen, ist, dass sie über verschiedene Arten von Vorüberlegungen sprechen.

Die Hauptsache, die bestimmt, ob ein Parameter als Referenz übergeben werden soll, ist die Funktionssignatur selbst, und die Grundlagen dafür haben sich seit PHP 4 nicht geändert. Betrachten Sie dieses Beispiel:

%Vor%

Hier wird die äußere Variable $a als Wert an die Funktion übergeben, so als ob sie als $by_value = $a; zugewiesen wird - Änderungen an $by_value können $a nicht beeinflussen. Die Variable $b wird jedoch durch Verweis übergeben; genau wie eine Zuweisung der Form $by_reference =& $b; bedeutet dies, dass es eine Variable gibt, die durch zwei Namen referenziert wird, und jede Zuweisung zu einer wird als Zuweisung für beide fungieren.

Wenn Sie einen "normalen" Wert (eine Zeichenfolge, eine Zahl oder ein Array) als Wert übergeben, wird dessen Wert einfach in die neue Variable kopiert. Ab PHP 5 : Wenn Sie ein Objekt nach Wert übergeben, passiert etwas anderes - der kopierte "Wert" ist nur ein Zeiger auf dasselbe Objekt. Das heißt, wenn $a ein Objekt wäre, könnten Sie $by_value->some_property = 42; und $a->some_property auch 42 aufrufen. Wenn Sie $by_value jedoch einen neuen Wert zuweisen, wirkt sich dies nicht auf $a aus.

Bis PHP 5.4 gab es eine zusätzliche Möglichkeit, einen Parameter als Referenz zu übergeben, um das Referenzverhalten zur Call-Zeit . Dies bedeutet, dass Sie foo(&$a, &$b); und "capture" Änderungen an $by_value in die foo() -Funktion schreiben können. Sich darauf zu verlassen, war im Allgemeinen eine schlechte Idee, und so wurde es entfernt. (Es ist in 5.4 gelandet, weil es in PHP 6 entfernt werden sollte, aber dieses Projekt wurde auf unbestimmte Zeit gesetzt, wobei die kleineren Änderungen in 5.3 und 5.4 landen).

Schließlich können Funktionen eine Variable als Referenz zurückgeben (wie hier im Handbuch beschrieben). Dies ist ein wenig fummelig, da es tatsächlich erforderlich ist, & in zwei Stellen zu setzen: Zu Beginn der Funktionsdeklaration sollte return bedeuten, dass "diese Variablenreferenz zurückgeben" nicht heißen soll "gebe diesen Wert zurück"; und im Code, der es aufruft, um eine Variable zu dieser Referenz zuzuweisen, anstatt nur ihren Wert zu kopieren. Hier ist ein dummes Beispiel, das einen Referenzparameter mit einem Referenz-Return kombiniert (die beiden müssen nicht zusammenpassen, es ist nur ein Beispiel):

%Vor%

Beachten Sie, dass viele Leute irrtümlich glauben, dass das Übergeben einer Variablen per Referenz ihnen einen Leistungsvorteil bringt, und dies war oft der einzige Grund dafür, Call-Time-Pass-by-Reference zu verwenden. Dies ist in der Tat in der Regel falsch, da die Zend Engine, die PHP antreibt, eine Technik namens "copy on write" verwendet, um mehrere Variablen zu belassen, die denselben Wert auf dasselbe Speicherelement haben, auch wenn sie nicht eingebunden sind Verweise. Tatsächlich wird diese Optimierung aufgrund der Art und Weise, in der die Engine verfolgt, welche Variablen im Copy-on-Write-Zustand sind, durch die Referenzzuweisung im Allgemeinen vereitelt

    
IMSoP 07.11.2013, 22:46
quelle
2

Nein, ist es nicht.

  • Objekte werden immer automatisch als Referenzen übergeben ( info! siehe unten für weitere wichtige Informationen!)

  • Das Deklarieren von Parametern als Referenzen muss in der Funktionsdefinition geschehen:

    %Vor%

    Nicht zum Zeitpunkt des Aufrufs:

    %Vor%

Wenn Sie ein Objekt wie üblich übergeben, können Sie den Status des Objekts (Eigenschaften) ändern.
Nehmen Sie an, dass $obj eine Instanz der Klasse TestClass ist, die eine Membervariable namens hello enthält ( klicken Sie hier, um ein vollständiges Beispiel auf Ideone.com zu erhalten ): %Vor%

Dies sollte selbsterklärend sein. Wenn Sie nun denselben Code verwenden, aber $obj einen anderen Wert zuweisen, anstatt den Status des Objekts zu ändern, führt dies zu keiner Änderung ( → Ideone.com ):

%Vor%

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

%Vor%     
ComFreek 07.11.2013 22:18
quelle
1

Nein, das sind nicht dieselben. PHP 5.4+ erkennt gerade beim Aufruf, ob ein Verweis erforderlich ist, wenn die Funktion aufgerufen wird, indem die Deklaration geprüft wird.

Also nein, nicht veraltet, da Sie den Referenzoperator in der Funktionsdeklaration benötigen, wenn dies Ihre beabsichtigte Verwendung ist.

    
lollercoaster 07.11.2013 22:17
quelle