2011-01-10 40 views
13

¿Hay alguna manera de invocar una función a través de variables?php - llamar a una función de forma dinámica

Por ejemplo, quiero llamar a la función de inicio de sesión(). ¿Puedo hacer esto:

$varFunction = "Login"; //to call the function 

¿Puedo usar $ varFunction?

+1

sí, PHP admite esto. Pero le sugiero que no lo use, a menos que sea masoquista o planee sabotaje –

+2

hola, en realidad el motivo es porque me gustaría tener el mismo nombre de función, pero para diferentes módulos. así que, por ejemplo, el módulo de inicio de sesión y el módulo de perfil tienen una función llamada main() – nuttynibbles

+0

Doh! ** ¡Heredadlo! –

Respuesta

23

Sí, puede:

$varFunction(); 

O:

call_user_func($varFunction); 

Asegurar que valide $ varFunction de entrada maliciosa.


edición:

Para sus módulos, considerar algo como esto (en función de sus necesidades reales):

abstract class ModuleBase { 
    public function main() { 
    echo 'main on base'; 
    } 
} 

class ModuleA extends ModuleBase { 
    public function main() { 
    parent::main(); 
    echo 'a'; 
    } 
} 

class ModuleB extends ModuleBase { 
    public function main() { 
    parent::main(); 
    echo 'b'; 
    } 
} 

function runModuleMain(ModuleBase $module) { 
    $module->main(); 
} 

y luego llamar runModuleMain() con la instancia de módulo correcto.

+0

hey tks ... creo que usaré esto. ¿Hay alguna posibilidad de que la empresa de alojamiento web deshabilite esta función? – nuttynibbles

+0

Esto es solo una secuencia de comandos, por lo que si deshabilitan esto probablemente no podrá ejecutar ningún código. – maartenba

6

Se puede utilizar ...

$varFunction = "Login"; 
$varFunction(); 

... y ni que decir tiene que asegurarse de que la variable es de confianza.

+0

hey tks esto también funciona. sin embargo, wats lo diferente entre esto y call_user_func(); ?? – nuttynibbles

+0

@nuttynibbles Ninguno realmente, la versión que mencioné es azúcar más sintáctica para la llamada a la función. Probablemente haya algunas diferencias menores, pero no estoy seguro de qué. – alex

2
<?php 
    $fxname = 'helloWorld'; 

    function helloWorld(){ 
    echo "What a beautiful world!"; 
    } 

    $fxname(); //echos What a beautiful world! 
?> 
0

Debería considerar usar clases para módulos, ya que esto le permitiría tener una estructura de código consistente y mantener los nombres de método idénticos para varios módulos. Esto también le dará la flexibilidad de heredar o cambiar el código para cada módulo.

En el tema, aparte de los métodos de llamada como se indicó anteriormente (es decir, utilizando variables como nombres de funciones o call_user_func_ * funciones familia), comenzando con PHP 5.3 puede usar closures que son funciones anónimas dinámicas, que podrían proporcionarle con una forma alternativa de hacer lo que quieras.

Cuestiones relacionadas