usar - Pasando un método de instancia como argumento en PHP
paso de parametros por valor y por referencia php (3)
Los métodos y las propiedades tienen espacios de nombres separados en PHP, por lo que $this->bar
evalúa como null
: estás accediendo a una propiedad no definida .
La forma correcta de crear una matriz en forma de array($object, "methodName")
:
Pasando la devolución de llamada correctamente:
$listener->add(array($this, ''bar''));
La sugerencia de tipo que ha dado está bien, como en PHP 5.4, es decir.
Me gustaría crear una clase de oyente
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);
Pero este código falla con este error:
Aviso: Propiedad no definida: Foo :: $ bar en index.php en la línea 18
Error fatal detectable: el argumento 1 pasado a Listener :: add () debe ser llamable, nulo, llamado en index.php en la línea 18 y definido index.php en la línea 5
¿Qué estoy haciendo mal?
No creo que puedas especificar una llamada de esta manera ...
Tratar
$listener->add(array($this, ''bar''));
Y vea http://php.net/manual/en/language.types.callable.php también.
Antes de PHP 5.4, no había ningún tipo llamado
callable
, por lo tanto, si lo usa como una sugerencia de tipo, significa "la clase llamadacallable
". Si usa PHP> = 5.4,callable
es una sugerencia válida.Un llamable se especifica mediante una cadena que describe el nombre del llamable (un nombre de función o un nombre de método de clase, por ejemplo) o una matriz donde el primer elemento es una instancia de un objeto y el segundo elemento es el nombre del método que se debe llamado.
Para PHP <5.4, reemplazar
public function add(callable $function)
con:
public function add($function)
Llámalo con:
$listener->add(array($this, ''bar''));