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

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

Bu doens't çalışma:Dizeyle çağrı yöntemi?

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

sadece possibilites call_user_func(); kullanmaktır?

cevap

88

Dene:

güvenle çağrılabilir ilk olup olmadığını kontrol ederek yapabilirsiniz:

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

fonksiyonu varsa mutlaka kontrol edin: function_exists() ilk! –

+0

Çalışıyor. İşlev var veya izin verilen dizi gibi herhangi bir güvenlik hilesi kullanmalı mıyım? –

+3

@MarekBar Eğer giriş kullanıcıdan geliyorsa, her zaman düzgün bir şekilde çıkarmalısınız. İzin verilen eylemlerle beyaz listeyi kullanın. –

6

OP, call_user_func() söz ve call_user_func_array() de iyi seçenekleri nelerdir Reemphasizing. Özellikle, call_user_func_array() parametrelerin listesi her bir işlev için farklı olabilirken parametreleri aktarırken daha iyi bir iş yapar.

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