2011-03-27 82 views
30
Class MyClass{ 
    private $data=array('action'=>'insert'); 
    public function insert(){ 
    echo 'called insert'; 
    } 

    public function run(){ 
    $this->$this->data['action'](); 
    } 
} 

该好好尝试一下工作:通过字符串调用方法?

$this->$this->data['action'](); 

只possibilites是使用call_user_func();

回答

88

尝试:

可以安全地通过检查,如果它是可调用第一做到这一点:

$action = $this->data['action']; 
if(is_callable(array($this, $action))){ 
    $this->$action(); 
}else{ 
    $this->default(); //or some kind of error message 
} 
+3

一定要检查是否函数存在:function_exists()第一! – 2011-03-27 18:39:33

+0

它的工作原理。我应该使用任何安全技巧,如函数存在或函数允许数组? – 2012-11-01 18:49:46

+3

@MarekBar如果输入来自用户,您应该始终将其正确转义。理想情况下,使用允许的操作的白名单。 – 2012-11-03 16:11:29

6

重新强调了OP提到什么,call_user_func()call_user_func_array()也是不错的选择。特别是,call_user_func_array()在传递参数方面做得更好,因为每个函数的参数列表可能不同。

call_user_func_array(
    array($this, $this->data['action']), 
    $params 
);