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

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

Este trabajo doens't:¿Método de llamada por cadena?

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

sólo posibilidades es utilizar call_user_func();?

Respuesta

88

Probar:

Puede hacerlo de manera segura mediante la comprobación de si es exigible en primer lugar:

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

Asegúrese de verificar si la función existe: function_exists() first! –

+0

Funciona. ¿Debería usar algún truco de seguridad como función existe o funciones permitidas? –

+3

@MarekBar Si la entrada proviene del usuario, siempre debe escapar de manera adecuada. Idealmente, use una lista blanca con acciones permitidas. –

6

Subrayando de nuevo lo que menciona el PO, call_user_func() y call_user_func_array() también son buenas opciones. En particular, call_user_func_array() hace un mejor trabajo al pasar parámetros cuando la lista de parámetros puede ser diferente para cada función.

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