Übergeben Sie eine Instanz-Methode als argument in PHP
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?
Ich bin nicht wirklich ein Spezialist in oop, aber könnte es sein, im Zusammenhang mit der Tatsache, dass die listener nicht über ein Konstrukt Methode?
InformationsquelleAutor 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:
PHP 5 introduces type hinting. Functions are now able to force parameters to be objects (by specifying the name of the class in the function prototype), interfaces, arrays (since PHP 5.1) or callable (since PHP 5.4).
Quelleja, das ist es, was ich meinte. Ein type-hint
callable
bedeutet "die Klasse mit dem Namencallable
".Nein, schaut auf das Letzte Stück des Satzes.
callable
eigentlich bedeutet die richtige als PHP 5.4 😉 Oder hier:Callbacks can be denoted by callable type hint as of PHP 5.4.
danke, aktualisiert.
InformationsquelleAutor 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-hint, die Sie gegeben haben okay—PHP 5.4, das ist.
InformationsquelleAutor phant0m
Ich glaube nicht, können Sie angeben aufrufbar...
Versuchen
Sehen und http://php.net/manual/en/language.types.callable.php zu.
... weil die Objekte immer so behandelt, als Referenzen und nie kopiert werden.
InformationsquelleAutor luiges90