Call_user_func() ожидает, что параметр 1 будет действительным обратным вызовом
Я просто играю с функцией call_user_func в PHP и получаю эту ошибку при запуске этого простого кода:
<?php
class A
{
public $var;
private function printHi()
{
echo "Hello";
}
public function __construct($string)
{
$this->var = $string;
}
public function foo()
{
call_user_func($this->var);
}
}
$a = new A('printHi');
$a->foo();
?>
Я знаю, что если я создаю функцию вне класса с именем printHi, она отлично работает, но я имею в виду класс print hi и не знаю, почему "this" не регистрируется.
Ответы
Ответ 1
$this->var
оценивает printHi
в вашем примере. Однако, когда вы вызываете метод класса, вам нужно передать обратный вызов как массив, где первым элементом является экземпляр объекта, а второй элемент - это имя функции:
call_user_func(array($this, $this->var));
Вот документация по действительным обратным вызовам: http://www.php.net/manual/en/language.types.callable.php
Ответ 2
Вместо ответа Omar вы также можете сделать статическую функцию класса printHi()
, поэтому вы можете называть ее из call_user_func('A::printHi')
, например:
class A
{
public $var;
public static function printHi()
{
echo "Hello";
}
public function __construct($string)
{
$this->var = $string;
}
public function foo()
{
call_user_func($this->var);
}
}
$a = new A('A::printHi');
$a->foo();
См. живой пример