在PHP中,是否可以将变量调用为函数


Is it possible in PHP to call a variable as function?

可能重复:
使用变量定义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_funccall_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;
}