可能重复:
使用变量定义PHP函数
在PHP 中使用变量作为函数名
我想执行一个条件函数调用,但我不一定知道函数会是什么,所以这将是一个漫长的切换。
例如;
$userSelection = "calculator"; /* or "stocks" or whatever widget */
$widget->get_widget($userSelection);
public function __construct($userSelection){
/* pseudo code */
call function $userSelection();
}
public function calculator(){
/* Get Calculator */
}
当然有。这个功能被称为变量函数:
$functionName = "strlen";
$length = $$functionName("Hello world!");
$$var(...)
语法很方便,但它只适用于自由函数。如果您想以这种方式调用类方法,则需要使用call_user_func
或call_user_func_array
(这些函数也可以处理"自由函数"的情况)。
查看调用用户函数。这允许您调用另一个函数,例如
call_user_func('calculator')
call_user_func($userSelection);
http://php.net/manual/en/function.call-user-func.php
看看这个php函数:
call_user_func():http://php.net/manual/de/function.call-user-func.php
call_user_func_array():http://www.php.net/manual/de/function.call-user-func-array.php
create_function():http://www.php.net/manual/de/function.create-function.php
还有一种直接(尽管很难看)的执行语法:
function some_func(args) {...}
$function_name='some_func';
$$function_name(args2);
您可以使用call_user_func()
,如下所示:
$userSelection = "calculator";
call_user_func($userSelection[, $param1, $param2, ...]);
call_user_func_array($userSelection, $params);
如果它只是你想要的一个函数,那么使用它应该可以解决你的问题
$function = "echo";
$$function "fooBar";
如果它是一个你想保持灵活性的类方法,请使用magic方法__call(),它将允许你使用未预定义的方法名称。
__call()
是在对象上下文中调用不可访问的方法时触发的。
即
class Foo {
public function __call($name, $arguments) {
echo $name;
}
}
$foo = new Foo();
$foo->bar(); // will echo "bar"
PHP内置函数'eval'可以做任何事情,但要注意注入。
$var = "somefunction";
eval("$var();");
http://php.net/manual/en/function.eval.php
如果这就是你的意思,那就很简单了。
function calculator() {
echo 'foo';
}
$userSelection = "calculator";
if (function_exists($userSelection)) {
$userSelection();
}
或者在一个类中,比如你的例子:
class widget {
public function __construct($userSelection) {
echo 'constructed widget<br>';
if (function_exists($userSelection)) {
$this->$userSelection();
}
}
public function calculator() {
echo 'bar';
}
}
$userSelection = "calculator";
$widget = new widget($userSelection);
或者,当函数是类的一部分时,从类外部调用。
class widget {
public function calculator() {
echo 'bar';
}
}
$widget = new widget();
$userSelection = "calculator";
$widget->$userSelection();
不过,我会使用if/else语句来确定要调用的函数,只是为了确保只执行有效的函数(你是净化用户选择,还是只是从$_POST
中获取?后者是一个非常糟糕的主意)。
您可以执行以下操作:
$var = 'abc';
switch ($var) {
case 'abc':
$result = $var('test param');
echo $result;
break;
default :
echo 'default';
break;
}
function abc($data) {
return $data;
}