Eine Instanzmethode als Argument in PHP übergeben
Möchte ich das erstellen einer Listener-Klasse
class Listener {
var $listeners = array();
public function add(callable $function) {
$this->listeners[] = $function;
}
public function fire() {
foreach($this->listeners as $function) {
call_user_func($function);
}
}
}
class Foo {
public function __construct($listener) {
$listener->add($this->bar);
}
public function bar() {
echo 'bar';
}
}
$listener = new Listener();
$foo = new Foo($listener);
Aber dieser code schlägt fehl mit dieser Fehlermeldung:
Notice: Undefined property: Foo::$bar in index.php on line 18
Abfangbaren fatal error: Argument 1 passed to Listener::add() muss aufrufbar sein, null, gegeben, genannt, index.php in Zeile 18 und definiert index.php in Zeile 5
Was mache ich falsch?
InformationsquelleAutor der Frage Gergely Fehérvári | 2012-11-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bevor PHP 5.4, gab es keinen Typ mit dem Namen
callable
so dass, wenn Sie es verwenden, als eine Art Hinweis, es heißt "die Klasse mit dem Namencallable
". Wenn Sie mit PHP >= 5.4,callable
ist ein Gültiger Hinweis.Einer aufrufbar ist festgelegt durch eine Zeichenfolge Beschreibung der name der callable (name einer Funktion oder Methode einer Klasse den Namen zum Beispiel) oder ein array, wobei das erste element ist eine Instanz von einem Objekt und das zweite element ist der name der Methode, die aufgerufen werden.
Für PHP < 5.4 ersetzen
mit:
Rufen Sie es mit:
InformationsquelleAutor der Antwort rid
Methoden und Eigenschaften haben getrennte Namensräume, die in PHP, die ist, warum
$this->bar
ausgewertetnull
: Du bist Zugriff auf eine nicht definierte Eigenschaft.Den richtigen Weg, um erstellen Sie ein array in der form von
array($object, "methodName")
:Übergabe der callback - richtig:
Den type-hintdie Sie gegeben haben okay—PHP 5.4, das ist.
InformationsquelleAutor der Antwort phant0m
Ich glaube nicht, können Sie angeben aufrufbar...
Versuchen
Sehen und http://php.net/manual/en/language.types.callable.php zu.
InformationsquelleAutor der Antwort luiges90