2012-02-01 84 views
0

不知道是不是我的措辭問題的權利,但如果這樣做的更簡單的(短)的方式基本上是我想知道的是:動態調用PHP函數?

switch($type) { 
    case 'select': $echo = $this->__jw_select($args); break; 
    case 'checkbox': $echo = $this->__jw_checkbox($args); break; 
    case 'radio': $echo = $this->__jw_radio($args); break; 
    case 'input': $echo = $this->__jw_input($args); break; 
    case 'textarea': $echo = $this->__jw_textarea($args); break; 
    default: return null; 
} 

有什麼辦法,我可以做些什麼像$echo = $this->__jw_{$type}($args);?我試過這段代碼,當然,它失敗了。有任何想法嗎?

回答

1
$field = "__jw_$type"; 
$echo = $this->{$field}($args); 

或者更簡單地說,

$echo = $this->{"__jw_$type"}($args); 
+1

沒有犯罪託姆你也應該注意,這不是一個很好的解決方案。 – DarthVader 2012-02-01 06:27:56

+0

如果您打算這樣做,我至少會使用一個有效函數名稱的白名單,並在實際調用函數之前檢查它是否存在。即:if(in_array($ field,array('input','radio',...){...} – Steven 2012-02-01 06:38:46

+0

老實說它並不重要 - 那個if的'else'通常是一些東西沿着「觸發錯誤」的路線......如果方法不存在,反正會發生,爲方法名添加一個唯一的前綴可以確保你不會碰到不應該被調用的東西(假設你 – Amber 2012-02-01 06:59:50

1
$action = "__jw__$type"; 
$this->$action($args); 

當然,你真的想驗證$type是一個允許的類型。

2

試試這個:

$method = "__jq_$type"; 
$echo = $this->$method($args); 

另外,使用call_user_func

$method = "__jq_$type"; 
$echo = call_user_func(array($this, $method), $args); 

當然,還有的方法,沒有驗證名字他回覆。

2

有很多方法,你可以做到這一點,這裏有一個:

if(method_exists($this, "__jw_$type")) 
{ 
    $echo = $this->{"__jw_$type"}($args); 
} 
1

你可以嘗試這樣的事情:

$type = '__jw_'.$type; 
if(method_exists($type,$this)) 
    $this->{$type}($args);