如何从存储在变量中的字符串中调用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;
应该返回吧,你可以试试,但我不认为这将工作的功能