Я хочу вызвать функцию, основанную на переменной.
function sound_dog () {return 'woof'; } function sound_cow () {return 'moo'; } $ animal = 'cow'; print sound _ {$ animal} (); *
Строка * – это строка, которая неверна.
Я делал это раньше, но я не могу найти его. Я знаю о потенциальных проблемах безопасности и т. Д.
Кто угодно? Большое спасибо.
Вы можете сделать это, но не без интерполяции строки сначала:
$animfunc = 'sound_' . $animal; print $animfunc();
Или, пропустите временную переменную с помощью call_user_func () :
call_user_func('sound_' . $animal);
Вы можете сделать это следующим образом:
$animal = 'cow'; $sounder = "sound_$animal"; print ${sounder}();
Однако гораздо лучшим способом было бы использовать массив:
$sounds = array('dog' => sound_dog, 'cow' => sound_cow); $animal = 'cow'; print $sounds[$animal]();
Одно из преимуществ метода массива заключается в том, что, когда вы вернетесь к своему коду через шесть месяцев и задаетесь вопросом «gee, где эта функция sound_cow
используется?» вы можете ответить на этот вопрос простым текстовым поиском, вместо того чтобы следовать всей логике, которая на лету создает имена переменных функций.
http://php.net/manual/en/functions.variable-functions.php
Чтобы сделать ваш пример, вы бы сделали
$animal_function = "sound_$animal"; $animal_function();
Вы должны спросить себя, почему вы должны это делать, возможно, вам нужно реорганизовать свой код на следующее:
function animal_sound($type){ $animals=array(); $animals['dog'] = "woof"; $animals['cow'] = "moo"; return $animals[$type]; } $animal = "cow"; print animal_sound($animal);
Вы можете использовать $this->
и self::
для класс-функций. Пример приведен ниже с параметром входного параметра.
$var = 'some_class_function'; call_user_func(array($this, $var), $inputValue); // equivalent to: $this->some_class_function($inputValue);