Das PHP-Handbuch besagt
Es ist nicht möglich, eine
$this
anonyme Funktion vor PHP 5.4.0 zu verwenden
auf der Seite für anonyme Funktionen . Aber ich habe festgestellt, dass ich es zum Laufen bringen kann, indem ich es $this
einer Variablen zuweise und die Variable an eine use
Anweisung in der Funktionsdefinition übergebe.
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
Ist das eine gute Praxis?
Gibt es eine bessere Möglichkeit, $this
mit PHP 5.3 auf eine anonyme Funktion zuzugreifen ?
php
anonymous-function
dampfbetrieben
quelle
quelle
$CI = $this;
und$CI =& $this;
sind nicht wirklich identisch. Vielleicht für Ihre Zwecke, aber sie sind nicht gleich. Versuchen Sie es$CI = 'bla'; var_dump($this);
mit beiden Versionen, um den Unterschied zu erkennen.Antworten:
Es schlägt fehl, wenn Sie versuchen, eine geschützte oder private Methode darauf aufzurufen, da die Verwendung auf diese Weise als Aufruf von außen gilt. Soweit ich weiß, gibt es in 5.3 keine Möglichkeit, dies zu umgehen, aber mit PHP 5.4 wird es wie erwartet funktionieren:
Darüber hinaus können Sie für Anonymus-Funktionen (Closing Rebinding) ändern, auf was $ dies zur Laufzeit zeigt:
Effektiv haben Anonymus-Funktionen eine bindTo () -Methode , bei der der erste Parameter verwendet werden kann, um anzugeben, auf was $ dies zeigt, und der zweite Parameter steuert, wie hoch die Sichtbarkeitsstufe sein soll . Wenn Sie den zweiten Parameter weglassen, entspricht die Sichtbarkeit dem Aufruf von "außen", z. Auf öffentliche Objekte kann nur zugegriffen werden. Beachten Sie auch die Funktionsweise von bindTo. Es ändert nicht die ursprüngliche Funktion, sondern gibt eine neue zurück .
quelle
$this
.Verlassen Sie sich nicht immer auf PHP, um Objekte als Referenz zu übergeben. Wenn Sie eine Referenz selbst zuweisen, ist das Verhalten nicht das gleiche wie in den meisten OO-Sprachen, in denen der ursprüngliche Zeiger geändert wird.
Ihr Beispiel:
sollte sein:
HINWEIS Die REFERENZ "&" und $ CI sollten zugewiesen werden, nachdem die letzten Aufrufe durchgeführt wurden. Andernfalls kann es sein, dass Sie in PHP nicht immer eine unvorhersehbare Ausgabe haben. Der Zugriff auf eine Referenz ist nicht immer dasselbe wie der Zugriff auf die ursprüngliche Klasse - wenn dies sinnvoll ist.
http://php.net/manual/en/language.references.pass.php
quelle
Das ist die normale Art und Weise, wie es gemacht wurde.
Übrigens, versuchen Sie zu entfernen, dass
&
es ohne dies funktionieren sollte, da Objekte in irgendeiner Weise an ref vorbeigehen .quelle
Das scheint in Ordnung zu sein, wenn Sie als Referenz vorbeigehen, ist dies der richtige Weg, dies zu tun. Wenn Sie PHP 5 verwenden, benötigen Sie das
&
Symbol vorher nicht,$this
da es unabhängig davon immer als Referenz übergeben wird.quelle
Das ist in Ordnung. Ich sollte denken, dass Sie dies auch tun könnten:
... da Zuordnungen mit Objekten immer Referenzen kopieren, nicht ganze Objekte.
quelle