Я хотел бы создать класс 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
Что я делаю не так?
До 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 тоже.