PHP:函数名中的变量

时间:2009-11-22 04:35:08

标签: php variables

我想根据变量触发一个函数。

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

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

*行是不正确的行。

我以前做过这个,但我找不到。我知道潜在的安全问题等。

任何?非常感谢。

7 个答案:

答案 0 :(得分:22)

你可以这样做,但不能先没有插入字符串:

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

或者,使用call_user_func()跳过临时变量:

call_user_func('sound_' . $animal);

答案 1 :(得分:15)

你可以这样做:

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

然而,更好的方法是使用数组:

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

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

数组方法的一个优点是,当你六个月后回到你的代码并想知道“gee,这个sound_cow函数在哪里使用?”您可以通过简单的文本搜索来回答该问题,而不必遵循动态创建变量函数名称的所有逻辑。

答案 2 :(得分:4)

http://php.net/manual/en/functions.variable-functions.php

举个例子,你做

$animal_function = "sound_$animal";
$animal_function();

答案 3 :(得分:1)

您应该问自己为什么需要这样做,或许您需要将代码重构为以下内容:

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

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

答案 4 :(得分:0)

您可以将$this->self::用于类功能。示例下面提供了一个函数input-parameter。

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

答案 5 :(得分:0)

您可以使用花括号来构建函数名称。不确定向后兼容性,但至少PHP 7+可以做到这一点。

使用Carbon根据用户选择的类型('add'或'sub')添加或减去时间时,这是我的代码:

$type = $this->date->calculation_type; // 'add' or 'sub'

$result = $this->contactFields[$this->date->{'base_date_field'}]
                   ->{$type.'Years'}( $this->date->{'calculation_years'} )
                   ->{$type.'Months'}( $this->date->{'calculation_months'} )
                   ->{$type.'Weeks'}( $this->date->{'calculation_weeks'} )
                   ->{$type.'Days'}( $this->date->{'calculation_days'} );

这里的重要部分是{$type.'someString'}部分。这将在执行之前生成函数名称。因此,在第一种情况下,如果用户选择了“添加”,则{$type.'Years'}会变为addYears

答案 6 :(得分:0)

对于PHP >= 7,您可以使用以下方式:

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

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