2011-05-06 56 views
14

¿puedo poner una función en PHP dentro de una estructura if? de esta manera:Una función dentro de una estructura if

<?php 
    if(true){ 
     function HelloWorld(){ 
      echo "Hello World!!!"; 
     } 
     HelloWorld(); 
    } 
?> 

porque lo he intentado y funciona, pero no sé si es correcto o no. Gracias

Respuesta

15

Esto es perfectamente legal: simplemente define la función dentro del bloque de instrucciones if. Dicho esto, bastante por qué que desea hacer esto es un misterio.

Es también digno de mención que esta función estará disponible en el ámbito global (es decir: fuera del bloque de sentencias if), como ...

Todas las funciones y clases en PHP tienen el ámbito global - pueden llamarse fuera de una función incluso si fueran definidos dentro y viceversa.

Consulte el PHP User-defined functions manual page para obtener más información.

+1

"... porque puedo!" :) – eykanal

+0

bueno, eso es lo que una lambda básicamente es –

+0

@Doug: ehm ... ¿Qué? No, una lambda es definitivamente algo muy diferente de una función, que solo se define bajo circunstancias específicas: D – KingCrunch

7

Como middaparka says, esto es perfectamente legal, pero en términos de su uso, es posible que desee comprobar si existe una función antes de declarar que:

if (!function_exists("foo")) 
{ 
    function foo() 
    { 
     return "bar"; 
    } 
} 
5

Parece un poco extraño, pero sí es legal

A partir de PHP 5.3 si necesita una función con un alcance limitado (por ejemplo para una devolución de llamada) usted puede utilizar anonymous functions/closures

0

Básicamente sí, de acuerdo con the manual:

Cualquier instrucción válida de PHP puede aparecer dentro de una función , incluso otras funciones y definiciones de clases.

Personalmente no he tenido una situación en la que realmente haya hecho tal cosa. ¡La mayoría de las veces sería más fácil agrupar sus funciones en un lugar donde realmente se pueda encontrar! ;-)

1

Quería agregar una respuesta aquí, porque hay una advertencia que no se aborda en las otras respuestas.

Según mis pruebas en 5.3, parece que las funciones que se definen dentro de las estructuras if se definen en tiempo de ejecución, en lugar de en tiempo de compilación, como otras funciones.

Por ejemplo, fuera de un bloque condicional, esto:

foo(); 
function foo(){ 
    echo 'foo!'; 
} 

funciona bien debido a que la función se define en tiempo de compilación, y ejecutado en tiempo de ejecución.Pero llamar a la función antes de definirla, mientras que el interior de un bloque de condición:

if(1){ 
    foo(); // Call to undefined function! 
    function foo(){ 
     echo 'foo!'; 
    } 
} 

producirá un error de call to undefined function, al menos desde la versión 5.3.

Pero la definición de la función en un bloque if antes de llamar es válida:

if(1){  
    function foo(){ 
     echo 'foo!'; 
    } 
    foo(); // No errors, since function is defined! 
} 

Así que hay una Gotcha importante a tener en cuenta al definir las funciones dentro de un condicional: la función debe ser definida en el código antes de llamar a la función, ya que las funciones condicionales no parecen definirse en el momento de la compilación.

El OP también preguntó por el rendimiento. Si la función condicional se define en tiempo de ejecución en lugar de en tiempo de compilación como la mayoría de las otras funciones, esta función no se beneficiará de los amplificadores de rendimiento como el almacenamiento en caché OpCode, que según las circunstancias, podría ralentizar la aplicación. Por ejemplo, si el archivo php maestro parecía:

if($IsLoggedIn){ 
    // include files/functions and bootstrap here... 
} 

Entonces toda la aplicación podría no beneficiarse de código de operación de almacenamiento en caché en absoluto.

Cuestiones relacionadas