我需要能够调用一个函数,但是函数名存储在一个变量中,这可能吗? e.g:
function foo () { //code here } function bar () { //code here } $functionName = "foo"; // i need to call the function based on what is $functionName
Anyhelp会很棒。
谢谢!
答案 0 :(得分:431)
答案 1 :(得分:96)
我最喜欢的版本是内联版本:
${"variableName"} = 12;
$className->{"propertyName"};
$className->{"methodName"}();
StaticClass::${"propertyName"};
StaticClass::{"methodName"}();
您也可以在括号内放置变量或表达式!
答案 2 :(得分:17)
是的,有可能:
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
答案 3 :(得分:16)
正如已经提到的,有几种方法可以实现这一点,可能最安全的方法是call_user_func()
,或者如果必须的话,你也可以走$function_name()
的路线。可以使用这两种方法传递参数
$function_name = 'foobar';
$function_name(arg1, arg2);
call_user_func_array($function_name, array(arg1, arg2));
如果您调用的函数属于某个对象,您仍然可以使用其中任何一个
$object->$function_name(arg1, arg2);
call_user_func_array(array($object, $function_name), array(arg1, arg2));
但是,如果您要使用$function_name()
方法,如果名称以任何方式动态,则测试函数是否存在可能是个好主意
if(method_exists($object, $function_name))
{
$object->$function_name(arg1, arg2);
}
答案 4 :(得分:12)
如果其他人被谷歌带到这里,因为他们试图将变量用于某个类中的方法,下面是一个实际可行的代码示例。以上都不适用于我的情况。关键区别在于&
声明$c = & new...
和&$c
传递call_user_func
。
我的具体情况是实现某人的代码与csscolor.php类中的颜色和两个成员方法lighten()
和darken()
有关。无论出于何种原因,我想让相同的代码能够调用变亮或变暗而不是用逻辑选择它。这可能是我不仅仅使用if-else或更改调用此方法的代码的固执的结果。
$lightdark="lighten"; // or optionally can be darken
$color="fcc"; // a hex color
$percent=0.15;
include_once("csscolor.php");
$c = & new CSS_Color($color);
$rtn=call_user_func( array(&$c,$lightdark),$color,$percent);
请注意,使用$c->{...}
尝试任何操作都无效。在call_user_func
的php.net页面底部仔细阅读读者提供的内容后,我能够将上述内容拼凑在一起。另请注意,$params
作为数组对我来说不起作用:
// This doesn't work:
$params=Array($color,$percent);
$rtn=call_user_func( array(&$c,$lightdark),$params);
上述尝试会对预期第二个参数(百分比)的方法发出警告。
答案 5 :(得分:12)
迟了几年,但这是现在最好的方式:
$x = (new ReflectionFunction("foo"))->getClosure();
$x();
答案 6 :(得分:9)
答案 7 :(得分:6)
在使用命名空间时,只需添加关于动态函数名称的观点。
如果您正在使用名称空间,以下将不起作用,除非您的函数位于全局名称空间中:
namespace greetings;
function hello()
{
// do something
}
$myvar = "hello";
$myvar(); // interpreted as "\hello();"
您必须改为使用call_user_func()
:
// if hello() is in the current namespace
call_user_func(__NAMESPACE__.'\\'.$myvar);
// if hello() is in another namespace
call_user_func('mynamespace\\'.$myvar);
答案 8 :(得分:3)
如果你想调用一个对象的方法,可以补充@Chris K的答案,你可以在一个闭包的帮助下使用一个变量来调用它:
function get_method($object, $method){
return function() use($object, $method){
$args = func_get_args();
return call_user_func_array(array($object, $method), $args);
};
}
class test{
function echo_this($text){
echo $text;
}
}
$test = new test();
$echo = get_method($test, 'echo_this');
$echo('Hello'); //Output is "Hello"
我发布了另一个例子here
答案 9 :(得分:2)
使用call_user_func函数。
答案 10 :(得分:2)
让我说一下这些变量和函数:
$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";
}
要调用功能不带参数
// Calling sayHello()
call_user_func($functionName1);
你好!
使用一个参数调用函数
// Calling sayHelloTo("John")
call_user_func($functionName2, $friend);
尊敬的约翰,你好!
使用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);
亲爱的莎拉,你好吗?
再见!
答案 11 :(得分:1)
以下代码可以帮助在PHP中编写动态函数。 现在,函数名称可以通过变量&#39; $ current_page&#39;。
动态更改$current_page = 'home_page';
$function = @${$current_page . '_page_versions'};
$function = function() {
echo 'current page';
};
$function();
答案 12 :(得分:1)
如果您在对象上下文中尝试动态调用函数,请尝试以下代码:
$this->{$variable}();
答案 13 :(得分:0)
使用存储在变量中的名称安全地调用函数的最简单方法是
//I want to call method deploy that is stored in functionname
$functionname = 'deploy';
$retVal = {$functionname}('parameters');
我曾经使用过如下所示的方法在Laravel中动态创建迁移表,
foreach(App\Test::$columns as $name => $column){
$table->{$column[0]}($name);
}
答案 14 :(得分:-2)
我想到的一种非常规方法是,除非你通过一些写自己的超自治AI生成整个代码,否则很有可能你想要的功能#34;动态&#34; call,已在您的代码库中定义。那么为什么不检查字符串并做臭名昭着的ifelse
舞蹈来召唤......你明白我的观点。
例如
if($functionName == 'foo'){
foo();
} else if($functionName == 'bar'){
bar();
}
如果您不喜欢switch-case
阶梯的温和味道,即使ifelse
也可以使用。
我知道有些情况下&#34; 动态调用函数&#34;绝对必要(像一些修改自己的递归逻辑)。但是大多数日常琐碎的用例都可以被躲避。
它会从您的应用程序中消除很多不确定性,同时如果字符串与任何可用的函数都不匹配,则可以执行回退功能。定义。 IMHO。
答案 15 :(得分:-8)
我不知道为什么你必须使用它,对我来说听起来不是很好,但是如果只有少量的功能,你可以使用if / elseif结构。 我不知道是否可以直接解决。
等等 $ foo =“bar”; $ test =“foo”; echo $$ test;应该返回吧,你可以尝试一下,但我不认为这适用于功能