ООП в PHP: класс-функция из переменной? - PullRequest
28 голосов
/ 17 апреля 2010

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

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

Что-то похожее, похоже, это не работает?

Ответы [ 3 ]

56 голосов
/ 17 апреля 2010

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

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

6 голосов
/ 03 марта 2015

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

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

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

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

$req = $class::{$function_name}();
0 голосов
/ 11 декабря 2018

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

Пример:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...