Использование call_user_func в методе класса

Я пытаюсь настроить метод PHP, который получает объект и его имя, а затем вызывает этот метод объекта. Я пытаюсь ограничить использование строк в моем коде, поэтому я хотел бы сделать это с помощью пользовательского перечисления. Когда я запускаю этот пример, это вывод, который я получаю:

getTest

ПРЕДУПРЕЖДЕНИЕ call_user_func () ожидает, что параметр 1 будет допустимым обратным вызовом, второй элемент массива не является допустимым методом в строке номер 43

echo call_user_func (массив ($ объект, $ метод));

Хотя кажется, что он печатает правильный метод, он говорит, что передаваемый метод не является допустимым методом. Я запутался, потому что я следовал учебнику на PHP.net

http://php.net/manual/en/function.call-user-func.php

Как правильно использовать call_user_func в методе класса? Пожалуйста, дайте мне то, что я пропускаю / делаю неправильно?

abstract class MyEnum
{
final public function __construct($value)
{
$c = new ReflectionClass($this);
if(!in_array($value, $c->getConstants())) {
throw IllegalArgumentException();
}
$this->value = $value;
}

final public function __toString()
{
return $this->value;
}
}

class one {
private $test = 1;

public function getTest() {
return $this->test;
}
}

class two {
private $quiz = 2;

public function getQuiz() {
return $this->quiz;
}
}

class Number extends MyEnum {
const ONE = "getTest";
const TWO = "getQuiz";
}

function testCallback($object, $method) {
echo $method;
echo call_user_func(array($object, $method));
}

$temp1 = new one();
$temp2 = new two();

testCallback($temp1, new Number(Number::ONE));

-1

Решение

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

function testCallback($object, $method) {
echo $method;
if( !method_exists( $object, $method) ) throw new Exception( "Method does not exist ".$object::class.'::'.$method);
echo $object->$method();
}

Единственное время для использования call_user_func* это когда у вас есть аргументы (даже тогда вы могли бы использовать отражение), как это.

function testCallback($object, $method, array $args = []) {
echo $method;
if( !method_exists( $object, $method) ) throw new Exception( "Method does not exist ".$object::class.'::'.$method);
echo call_user_func_array( [$object,$method], $args);
}

Или с отражением (возможно, чуть-чуть медленнее)

function testCallback($object, $method, array $args = []) {
echo $method;
if( !method_exists( $object, $method) ) throw new Exception( "Method does not exist ".$object::class.'::'.$method);
echo (new ReflectionMethod( $object, $method))->invokeArgs( $object, $args );
}
0

Другие решения

Других решений пока нет …