Intereting Posts
Разрешение AWS AssumeRole не работает .htaccess переписать для хоста WordPress, размещенного на Bitnami / EC2 Как реализовать кеш HTML для сайта PHP? Laravel 4: установите флажок, по крайней мере, один как использовать CURL и PHP Простой HTML DOM Parser с объектом php: как получить ассоциативный массив с числовым индексом? Можно ли проверить, существует ли установленный ключ Redis, и если он не существует, установите его, если он существует, а затем выйдите, все как транзакция Как получить второе значение в раскрывающемся списке на основе выбранного в первом раскрывающемся списке Геолокация LONG / LAN в базе данных PHP эквивалентен верхней команде Linux Можно ли ОБНОВИТЬ таблицу JOINed, используя активную запись Codeigniter? Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым результатом MySQL Существуют ли чистые виртуальные функции в PHP, например, с C ++ Как получить тело POST в php? Процесс FastCGI превысил настроенный тайм-аут активности

PHP: переменная в имени функции

Я хочу вызвать функцию, основанную на переменной.

  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);