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.
"... porque puedo!" :) – eykanal
bueno, eso es lo que una lambda básicamente es –
@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