Передача метода экземпляра в качестве аргумента в 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);

Но этот код не с этой ошибкой:

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

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

Что я делаю неправильно?

Ответы

Ответ 1

  • До 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'));

Ответ 2

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

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

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

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

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