2012-02-01 3 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

+0

Если вы собираетесь это сделать, я бы хотя бы использовал белый список допустимых имен функций и проверял, что он присутствует, прежде чем называть функцию. т.е.: if (in_array ($ field, array ('input', 'radio', ...) {...} – Steven

+0

Честно говоря, это не имеет значения - 'else' этого' if' обычно будет чем-то в строке «вызвать ошибку» ... что произойдет в любом случае, если метод не существует. Добавление уникального префикса к имени метода гарантирует, что вы не столкнетесь с чем-то, что не должно быть вызвано (если предположить, что вы сделайте это правильно), так что это тоже не проблема. – Amber

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); 
Смежные вопросы