Можно ли вызывать функции из класса следующим образом:
$class = new class; $function_name = "do_the_thing"; $req = $class->$function_name();
Что-то похожее, похоже, это не работает?
Да, это возможно, это известно как переменные функции , посмотреть на это. Пример с официального сайта PHP: <?php class Foo { function Variable() { $name = 'Bar'; $this->$name(); // This calls the Bar() method } function Bar() { echo "This is Bar"; } } $foo = new Foo(); $funcname = "Variable"; $foo->$funcname(); // This calls $foo->Variable() ?> В вашем случае убедитесь, что функция do_the_thing существует. Также обратите внимание, что вы сохраняете возвращаемое значение функции: $req = $class->$function_name(); Попробуйте посмотреть, что содержит переменная $req. Например, это должно дать вам информацию: print_r($req); // or simple echo as per return value of your function Примечание: Функции переменных не будут работать с такими языковыми конструкциями, как echo(), print(), unset(), isset(), empty(), include(), require() и т.п. Используйте функции-оболочки, чтобы использовать любую из этих конструкций в качестве переменных функций.
Пример с официального сайта PHP:
<?php class Foo { function Variable() { $name = 'Bar'; $this->$name(); // This calls the Bar() method } function Bar() { echo "This is Bar"; } } $foo = new Foo(); $funcname = "Variable"; $foo->$funcname(); // This calls $foo->Variable() ?>
В вашем случае убедитесь, что функция do_the_thing существует. Также обратите внимание, что вы сохраняете возвращаемое значение функции:
do_the_thing
$req = $class->$function_name();
Попробуйте посмотреть, что содержит переменная $req. Например, это должно дать вам информацию:
$req
print_r($req); // or simple echo as per return value of your function
Примечание:
Функции переменных не будут работать с такими языковыми конструкциями, как echo(), print(), unset(), isset(), empty(), include(), require() и т.п. Используйте функции-оболочки, чтобы использовать любую из этих конструкций в качестве переменных функций.
echo(), print(), unset(), isset(), empty(), include(), require()
Мой самый простой пример:
$class = new class; $function_name = "do_the_thing"; $req = $class->${$function_name}();
$ {$ function_name} - это трюк
Также работает со статическими методами:
$req = $class::{$function_name}();
Вы можете использовать ReflectionClass.
ReflectionClass
Пример:
$functionName = 'myMethod'; $myClass = new MyClass(); $reflectionMyMethod = (new ReflectionClass($myClass))->getMethod($functionName); $relectionMyMethod->invoke($myClass); // same as $myClass->myMethod();
Не забудьте перехватить ReflectionException, если метод не существует.