valor usar una referencia por paso parametros otro metodos llamar estaticos ejemplos desde cuando clases clase archivo php class methods argument-passing

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?



  • 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 llamada callable ". 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''));