Как вызвать функцию PHP из строки, хранящейся в переменной - PullRequest
262 голосов
/ 17 июня 2009

Мне нужно иметь возможность вызывать функцию, но имя функции хранится в переменной, возможно ли это? например:

function foo ()
{
  //code here
}

function bar ()
{
  //code here
}

$functionName = "foo";
// i need to call the function based on what is $functionName

Любая помощь была бы великолепна.

Спасибо!

Ответы [ 15 ]

2 голосов
/ 29 марта 2019

Что я узнал из этого вопроса и ответов. Спасибо всем!

Допустим, у меня есть следующие переменные и функции:

$functionName1 = "sayHello";
$functionName2 = "sayHelloTo";
$functionName3 = "saySomethingTo";

$friend = "John";
$datas = array(
    "something"=>"how are you?",
    "to"=>"Sarah"
);

function sayHello()
{
echo "Hello!";
}

function sayHelloTo($to)
{
echo "Dear $to, hello!";
}

function saySomethingTo($something, $to)
{
echo "Dear $to, $something";
}
  1. Для вызова функции без аргументов

    // Calling sayHello()
    call_user_func($functionName1); 
    

    Hello!

  2. Для вызова функции с 1 аргументом

    // Calling sayHelloTo("John")
    call_user_func($functionName2, $friend);
    

    Дорогой Джон, привет!

  3. Для вызова функции с 1 или более аргументами Это будет полезно, если вы динамически вызываете свои функции и каждая функция имеет разное количество аргументов. Это мой случай, который я искал (и раскрыл). call_user_func_array является ключом

    // You can add your arguments
    // 1. statically by hard-code, 
    $arguments[0] = "how are you?"; // my $something
    $arguments[1] = "Sarah"; // my $to
    
    // 2. OR dynamically using foreach
    $arguments = NULL;
    foreach($datas as $data) 
    {
        $arguments[] = $data;
    }
    
    // Calling saySomethingTo("how are you?", "Sarah")
    call_user_func_array($functionName3, $arguments);
    

    Дорогая Сара, как ты?

Да, пока!

2 голосов
/ 17 июня 2009

Используйте функцию call_user_func.

1 голос
/ 24 февраля 2015

Следующий код может помочь написать динамическую функцию на PHP. теперь имя функции можно динамически изменять с помощью переменной '$ current_page'.

$current_page = 'home_page';
$function = @${$current_page . '_page_versions'};
$function = function() {
    echo 'current page';
};
$function();
0 голосов
/ 11 июня 2018

Один из нетрадиционных подходов, который мне пришёл в голову, это , если вы не генерируете весь код через какой-то супер-ультра-автономный ИИ, который пишет себя , есть большие шансы, что функции, которые вы хотите, "динамически" "вызов, уже определены в вашей кодовой базе. Так почему бы просто не проверить строку и не позорить ifelse танец, чтобы призвать ... Вы поймете мою точку зрения.

например.

if($functionName == 'foo'){
  foo();
} else if($functionName == 'bar'){
  bar();
}

Даже switch-case можно использовать, если вам не нравится мягкий вкус ifelse лестницы.

Я понимаю, что есть случаи, когда ", динамически вызывающий функцию ", будет абсолютной необходимостью ( Как некоторая рекурсивная логика, которая модифицирует себя ). Но большинство повседневных тривиальных сценариев использования можно просто избежать.

Это отсеивает большую неопределенность в вашем приложении, давая вам возможность выполнить резервную функцию, если строка не соответствует ни одному из определений доступных функций. ИМХО.

0 голосов
/ 17 июня 2009

Я не знаю, почему вы должны это использовать, мне это не очень хорошо звучит, но если есть только небольшое количество функций, вы можете использовать конструкцию if / elseif. Я не знаю, возможно ли прямое решение.

что-то вроде $ foo = "bar"; $ test = "foo"; echo $$ test;

должен вернуть бар, вы можете попробовать, но я не думаю, что это будет работать для функций

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