Передача метода экземпляра в качестве аргумента в 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, то есть.
Ответ 3
Я не думаю, что вы можете указать вызываемый таким образом...
Try
$listener->add(array($this, 'bar'));
И посмотрите http://php.net/manual/en/language.types.callable.php.