Wie man eine Schließung nennt, die eine Klassenvariable ist?
class MyClass {
var $lambda;
function __construct() {
$this->lambda = function() {echo 'hello world';};
//no errors here, so I assume that this is legal
}
}
$myInstance = new MyClass();
$myInstance->lambda();
//Fatal error: Call to undefined method MyClass::lambda()
Also, was ist die richtige syntax für das erreichen der Klasse Variablen ?
InformationsquelleAutor der Frage rsk82 | 2011-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
In PHP, Methoden und Eigenschaften werden in einem separaten namespace (Sie können eine Methode und eine Eigenschaft mit dem gleichen Namen), und ob Sie Zugriff auf eine Eigenschaft oder eine Methode ist abhängig von der syntax, die Sie verwenden, um so zu tun.
$expr->something()
ist ein Methodenaufruf, so wird PHP Suchesomething
in der Klasse' Liste der Methoden.$expr->something
ist eine Eigenschaft abrufen, so wird PHP Suchesomething
in der Klasse' Liste der Eigenschaften.$myInstance->lambda();
wird analysiert, wie eine Methode aufgerufen wird, so dass PHP sucht nach einer Methode mit dem Namenlambda
in Ihrer Klasse, aber es gibt keine solche Methode (daher der Call to undefined method Fehler).So dass Sie die fetch Eigenschaft syntax zum abrufen der lambda, und dann nennen Sie es.
PHP ab Version 7.0, können Sie dies mit
($obj->lambda)()
:Den Klammern stellen Sie sicher, dass PHP parst
($obj->lambda)
als Holen Sie die Eigenschaft mit dem Namen lambda -. Dann()
nennt das Ergebnis abrufen der Eigenschaft.oder Sie können dies tun, mit
->lambda->__invoke()
:__invoke
ist einer der Der PHP-Magische Methoden. Wenn ein Objekt implementiert diese Methode, es wird aufrufbarer: es kann aufgerufen werden, mit der$var()
syntax. Anonyme Funktionen sind Instanzen vonClosure
die implementiert__invoke
.Oder weisen Sie es zu einem lokalen Variablen:
Oder rufen Sie es mit call_user_func:
call_user_func
anrufen könnencallable
darunter auch anonyme Funktionen.Alternativ, wenn dies ist ein gemeinsames Muster in Ihrem code können Sie das setup eine
__call
Methode zum weiterleiten von anrufen an Ihre lambda:Nun das funktioniert:
Seit PHP 5.4 kann man auch in einer Charaktereigenschaft:
InformationsquelleAutor der Antwort arnaud576875
Können Sie auch anrufen, Ihre lambda-Funktion, ohne etwas zu ändern in Ihrer Klasse, mit ReflectionFunction.
oder wenn Sie Argumente übergeben, die dann
InformationsquelleAutor der Antwort akDeveloper