如何从存储在变量中的字符串中调用PHP函数

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

函数foo()
 {
   //代码在这里
 }

功能栏()
 {
   //代码在这里
 }

 $ functionName =“foo”;
 //我需要根据$ functionName来调用函数

Anyhelp会很棒。

谢谢!

$functionName()call_user_func($functionName)

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

 ${"variableName"} = 12; $className->{"variableName"}; $className->{"methodName"}(); StaticClass::${"variableName"}; StaticClass::{"methodName"}(); 

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

是的,这是可能的:

 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

如果有人被谷歌带到这里,因为他们试图在一个类中使用一个变量的方法,下面是一个代码示例,将实际工作。 以上都不适合我的情况。 关键区别在于在$c = & new... call_user_func中传递$c = & new...&$c的声明。

我的具体情况是在执行某个人的代码时,必须使用颜色和两个成员方法从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); 

上面的这个尝试会给出预期第二个参数(百分比)的方法的警告。

为了完整起见,您还可以使用eval() :

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

但是, call_user_func()是正确的方法。

如前所述,有一些方法可能是最安全的方法是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); } 

几年后,但这是现在最好的方式imho:

 $x = (new ReflectionFunction("foo"))->getClosure(); $x(); 

动态函数名称和命名空间

只是在使用名称空间时添加关于动态函数名称的一点。

如果您使用的是名称空间,除非您的函数位于全局名称空间中,否则以下内容将不起作用

 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); 

如果你想调用一个对象的方法,补充@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" 

我在这里贴了另一个例子

使用call_user_func函数。

以下代码可以帮助编写PHP中的动态函数。 现在函数名可以通过变量'$ current_page'来动态改变。

 $current_page = 'home_page'; $function = @${$current_page . '_page_versions'}; $function = function() { echo 'current page'; }; $function(); 

我不知道为什么你必须使用它,对我来说听起来不是那么好,但是如果只有少量的函数,你可以使用if / elseif构造。 我不知道是否可以直接解决。

像$ foo =“bar”; $ test =“foo”; echo $$ test;

应该返回吧,你可以试试,但我不认为这将工作的功能

Interesting Posts