Передача метода экземпляра в качестве аргумента в PHP

Я хотел бы создать класс Listener

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); 

Но этот код не справляется с этой ошибкой:

Примечание. Неопределенное свойство: Foo :: $ bar в index.php в строке 18

Обрезаемая фатальная ошибка: аргумент 1, переданный в Listener :: add (), должен быть вызван, null задан, вызван в index.php в строке 18 и определен index.php в строке 5

Что я делаю не так?

Related of "Передача метода экземпляра в качестве аргумента в PHP"

  • До PHP 5.4 не было типа с именем callable , поэтому, если вы используете его как подсказку типа, это означает «класс с именем callable ». Если вы используете PHP> = 5.4, callable является допустимым намеком.

  • Вызываемый указывается строкой, описывающей имя вызываемого (например, имя функции или имя метода класса) или массив, в котором первый элемент является экземпляром объекта, а второй элемент – это имя метода, который должен быть называется.

Для PHP <5.4 замените

 public function add(callable $function) 

с:

 public function add($function) 

Назовите его:

 $listener->add(array($this, 'bar')); 

Методы и свойства имеют отдельные пространства имен в PHP, поэтому $this->bar значение null : вы получаете доступ к неопределенному свойству .

Правильный способ создания массива в виде array($object, "methodName") :

Правильно выполните обратный вызов :

 $listener->add(array($this, 'bar')); 

Подсказка типа, которую вы дали, в порядке – от PHP 5.4, то есть.

Я не думаю, что вы можете указать вызываемый таким образом …

Пытаться

 $listener->add(array($this, 'bar')); 

И см. http://php.net/manual/en/language.types.callable.php тоже.