Подтвердить что ты не робот

OOP в PHP: функция класса из переменной?

Можно ли вызывать функции из класса следующим образом:

$class = new class;
$function_name = "do_the_thing";
$req = $class->$function_name();

Нечто похожее решение, похоже, не работает?

4b9b3361

Ответ 1

Да, возможно, это известно как переменные функции, посмотреть на это.

Пример из официального сайта 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() и тому подобное. Используйте функции обертки, чтобы использовать любую из этих конструкций в качестве переменных функций.

Ответ 2

Самый простой пример:

$class = new class;
$function_name = "do_the_thing";
$req = $class->${$function_name}();

${$ function_name} - это трюк

Также работает со статическими методами:

$req = $class::{$function_name}();

Ответ 3

Вы можете использовать ReflectionClass.

Пример:

$functionName = 'myMethod';
$myClass = new MyClass();
$reflectionMyMethod = (new ReflectionClass($myClass))->getMethod($functionName);

$relectionMyMethod->invoke($myClass); // same as $myClass->myMethod();

Не забудьте перехватить ReflectionException, если метод не существует.