2009-11-22 23 views
14

Quiero activar una función basada en una variable.PHP: Variable en un nombre de función

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

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

La línea * es la línea que no es correcta.

He hecho esto antes, pero no puedo encontrarlo. Soy consciente de los posibles problemas de seguridad, etc.

Anyone? Muchas gracias.

Respuesta

19

Usted puede hacer eso, pero no sin interpolación de la primera cadena:

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

O evite el temporal variable con call_user_func():

call_user_func('sound_' . $animal); 
+0

Muchas gracias. ¡Me salvaste un montón de irritación! – LibraryThingTim

+0

Este es un método intrigante. ¿Es un riesgo de seguridad dar una SOLICITUD de acceso directo variable a esto? Si es así, ¿qué medidas se pueden tomar para prevenirlo? ¿Quizás una lista de funciones a las que solo desea dar acceso, y una comprobación en contra de esta lista cuando se encuentra la SOLICITUD var de este nombre? –

+0

No debe dar acceso directo SOLICITUD (léase: SIEMPRE desinfecte la entrada del usuario). Una tabla de envío en la línea de la respuesta de Greg Hewgill es probablemente la mejor solución.Puede verificar la validez de la entrada REQUEST mediante array_key_exists(), solo asegúrese de citar los valores (sound_dog -> 'sound_dog') o enviará un aviso. – scribble

1

Usted debe preguntarse por qué tiene que estar haciendo esto, tal vez usted necesita para refactorizar su código a algo como lo siguiente:

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

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

Me parece que su método es mucho menos limpio. Esta es la mentalidad C –

+0

1 función que hace lo mismo que 2 funciones? – Sam152

+4

C mentalidad? ¿Usando una tabla hash? Más como la mentalidad de código de mantenimiento. – recursive

15

Usted puede hacerlo de esta manera:

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

Sin embargo , una manera mucho mejor sería utilizar una matriz:

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

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

una de las ventajas del método de matriz es que cuando vuelva a su código de seis meses más tarde y se preguntan "¿dónde está la función sound_cow?" puede responder esa pregunta con una simple búsqueda de texto en lugar de tener que seguir toda la lógica que crea nombres de funciones variables sobre la marcha.

0

Puede usar $this-> y self:: para funciones de clase. Ejemplo proporcionado a continuación con un parámetro de entrada de función.

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

Puede usar corchetes para construir el nombre de su función. No estoy seguro de compatibilidad con versiones anteriores, pero al menos PHP 7+ puede hacerlo.

Aquí está mi código cuando se utiliza carbono para sumar o restar tiempo basado en el tipo de usuario (de 'añadir' o 'sub') elegido:

$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'}); 

La parte importante aquí es la {$type.'someString'} secciones. Esto generará el nombre de la función antes de ejecutarlo. Entonces, en el primer caso, si el usuario ha elegido 'agregar', {$type.'Years'} se convierte en addYears.

Cuestiones relacionadas