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

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

function sound_dog() { return 'woof'; }
function sound_cow() { return 'moo'; }

$animal = 'cow';
print sound_{$animal}(); *

Строка * - это строка, которая неверна.

Я делал это раньше, но я не могу его найти. Я знаю о потенциальных проблемах безопасности и т.д.

Кто-нибудь? Большое спасибо.

Ответ 1

Вы можете сделать это, но не без интерполяции строки сначала:

$animfunc = 'sound_' . $animal;
print $animfunc();

Или, пропустите временную переменную call_user_func():

call_user_func('sound_' . $animal);

Ответ 2

Вы можете сделать это следующим образом:

$animal = 'cow';
$sounder = "sound_$animal";
print ${sounder}();

Однако гораздо лучший способ - использовать массив:

$sounds = array('dog' => sound_dog, 'cow' => sound_cow);

$animal = 'cow';
print $sounds[$animal]();

Одним из преимуществ метода массива является то, что, когда вы вернетесь к своему коду через шесть месяцев и задаетесь вопросом: "gee, где эта функция sound_cow используется?" вы можете ответить на этот вопрос простым текстовым поиском, вместо того чтобы следовать всей логике, которая на лету создает имена переменных функций.

Ответ 4

Вы должны спросить себя, почему вам нужно это делать, возможно, вам нужно реорганизовать свой код примерно так:

function animal_sound($type){ 
    $animals=array(); 
    $animals['dog'] = "woof"; 
    $animals['cow'] = "moo"; 
    return $animals[$type];
}

$animal = "cow";
print animal_sound($animal);

Ответ 5

Вы можете использовать $this-> и self:: для функций класса. Пример, представленный ниже с параметром входного параметра.

$var = 'some_class_function';
call_user_func(array($this, $var), $inputValue); 
// equivalent to: $this->some_class_function($inputValue);