Можно ли вызывать функции из класса следующим образом:
$class = new class;
$function_name = "do_the_thing";
$req = $class->$function_name();
Нечто похожее решение, похоже, не работает?
Можно ли вызывать функции из класса следующим образом:
$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()
и тому подобное. Используйте функции обертки, чтобы использовать любую из этих конструкций в качестве переменных функций.
Самый простой пример:
$class = new class;
$function_name = "do_the_thing";
$req = $class->${$function_name}();
${$ function_name} - это трюк
Также работает со статическими методами:
$req = $class::{$function_name}();
Вы можете использовать ReflectionClass
.
Пример:
$functionName = 'myMethod';
$myClass = new MyClass();
$reflectionMyMethod = (new ReflectionClass($myClass))->getMethod($functionName);
$relectionMyMethod->invoke($myClass); // same as $myClass->myMethod();
Не забудьте перехватить ReflectionException, если метод не существует.