我需要能够调用一个函数,但函数名存储在一个变量,这是可能的吗?例句:

function foo ()
{
    //code here
}

function bar ()
{
    //code here
}

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

当前回答

如果你在一个对象上下文中试图动态调用一个函数,请尝试如下代码:

$this->{$variable}();

其他回答

是的,这是可能的:

function foo($msg) {
    echo $msg."<br />";
}
$var1 = "foo";
$var1("testing 1,2,3");

来源:http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2

为了完整起见,你也可以使用eval():

$functionName = "foo()";
eval($functionName);

然而,call_user_func()是正确的方法。

我想到的一种非常规方法是,除非你是通过一些超级超级自主的AI来生成整个代码,否则你想要“动态”调用的函数很有可能已经在你的代码库中定义了。所以为什么不只是检查字符串,并做臭名昭著的ifelse舞蹈来召唤…你明白我的意思了。

eg.

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

如果你不喜欢ifelse梯子的无味味道,甚至可以使用开关盒。

我知道在某些情况下,“动态调用函数”是绝对必要的(就像一些修改自身的递归逻辑)。但是大多数日常琐碎的用例都可以被避开。

它从应用程序中清除了许多不确定性,同时如果字符串不匹配任何可用函数的定义,则为您提供了执行回退函数的机会。恕我直言。

我最喜欢的版本是内联版本:

${"variableName"} = 12;

$className->{"propertyName"};
$className->{"methodName"}();

StaticClass::${"propertyName"};
StaticClass::{"methodName"}();

你也可以把变量或表达式放在括号里!

我从这个问题和答案中学到了什么。感谢所有!

假设我有这些变量和函数:

$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";
}

To call function without arguments // Calling sayHello() call_user_func($functionName1); Hello! To call function with 1 argument // Calling sayHelloTo("John") call_user_func($functionName2, $friend); Dear John, hello! To call function with 1 or more arguments This will be useful if you are dynamically calling your functions and each function have different number of arguments. This is my case that I have been looking for (and solved). call_user_func_array is the key // 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); Dear Sarah, how are you?

耶再见!