2010-12-06 12 views
9

Considere la siguiente:PHP llamada a función Colocación

function f() { 
    return 'hi'; 
} 

echo f(); 

Vs este fragmento:

echo f(); 

function f() { 
    return 'hi'; 
} 

Cuando corro los guiones, que ambos producen los mismos resultados. Eso es genial.

Pero mi pregunta es (y no pude encontrar una buena respuesta o referencia en ninguna de mis búsquedas), ¿está bien llamar a la función antes de definirla (es decir, desde un análisis secuencial de la perspectiva del archivo de script) ?

No quiero encontrarme con ningún problema o desaprobación en el futuro si dejo la llamada de función delante del bloque de definición de función en mi archivo de secuencia de comandos.

+1

¿Es TAN difícil de probarlo usted mismo? ¿Poner este mismo ejemplo de código en el archivo php y ejecutarlo? –

+3

Lo probó sabio. * Cuando ejecuto el script, ambos producen los mismos resultados. Eso es genial. * Solo está preocupado por la desaprobación. –

+2

@Col. Metralla: en otros idiomas, sí. Pero PHP tiene muchos muchos caprichos, por lo que aunque su ejemplo funciona (lo que * él mismo hizo), existe la posibilidad de que bajo algunas circunstancias oscuras algo similar no funcione. O que toda la función se desaprovecha. – delnan

Respuesta

10

Desde el Manual:

funciones no necesitan ser definidos antes de que se hace referencia, excepto cuando una función se define condicionalmente como se muestra en los dos ejemplos siguientes.

La posibilidad de llamar (referenciar) a una función antes de que se defina es una función intencional de PHP y no creo que tenga que preocuparse de que se vuelva obsoleta.

Como observación, si puede elegir declarar la función antes o después, sería de sentido común declararla antes de usarla.

Nota: El siguiente código dará un error fatal porque la función solo se definirá en tiempo de ejecución.

<?php 
echo helloWorld(); 
if(1){ 
    function helloWorld() { 
     return 'hello world'; 
    } 
} 
?> 
+0

Excelente Alin ... no entendí ese párrafo en el Manual de PHP ... que responde mi pregunta –

+0

Alin ... presenta una declaración if() interesante. ¿Puedes explicar la importancia y el propósito de si (1)? Gracias (nunca me pareció eso antes, y me encanta aprender cosas nuevas todo el tiempo.) –

+0

Lo puse para demostrar el comportamiento diferente de las funciones definidas condicionalmente. Incluso si el código puede parecer equivalente a su MUESTRA B, colocando la declaración de función dentro de un si determina que se declarará cuando el guión llegue a eso si, y no antes de que comience el guión, como ocurre en los otros casos. –

-1

No importa dónde defina su función ni a dónde llame. Porque, hasta donde yo sé, la aplicación del servidor PHP primero lee toda la página y luego la ejecuta.

+0

Hasta donde yo sé, hay casos en que esto no funciona (esperemos las respuestas de los gurús de PHP ...). – delnan

+0

@delnan Funciones definidas condicionalmente. Ver mi respuesta –

+0

Sí ... Realmente me preguntaba si así es como se realizó el motor de análisis sintáctico.Yo también tengo curiosidad por los comentarios de Guru. –

0

Esta es una gran pregunta. Porque no tiene una respuesta realmente buena. PHP, si tiene la oportunidad, funcionará bien haciéndolo al revés. Hasta que no. Y no lo hará si, por ejemplo, la función se define en un archivo incluido aún por cargarse más adelante. PHP incluirá esos archivos a medida que ocurran en el código, por lo que obtendrá un error de función no definida en ese caso.

Este es un Getcha SERIO en PHP.

Ayuda a imaginar que incluye como copiar/pegar lo que estaba en el otro archivo en el código. Pero eso solo sucede cuando se ejecutan en código. Lo que significa que pueden ser dinámicos y estar basados ​​en el código de ejecución. Pero también significa que no se pueden preprocesar y vincular de antemano.

+1

R: Sí, lo ejecutó. B: Él no estaba preguntando si funcionaría. C: es una gran pregunta porque expone algo que es un gran problema en PHP. D: Deberías aprender a leer lo que dice la gente y dejar de ser un idiota. – DampeS8N

+1

@Col. Shrapnel: Tu comentario puede estar justificado o no, pero publicarlo dos veces es seguro innecesario. – delnan

+1

Con todo respeto Coronel, ¿no tienes mejores cosas que hacer con tu tiempo que se sientan en stackoverflow y "disparar" a las personas que intentan aprender? –

0

me resulta una buena práctica definir primero mis funciones y luego llamarlos, pero no asuntos en los que no se los pone siempre están ahí;)

Además, me gustaría tener mi funciones separadas en diferentes archivos php, dependiendo del uso, sólo para ser organizado :)

+0

Yo también tengo muchos, muchos incluyen/requieren en todas partes. Hace que los archivos de script sean más fáciles de leer cuando simplemente busca bloques de código que sirven para ciertos propósitos. –

1

pasos del compilador son así:

  • Convierte una secuencia de caracteres en tokens
  • analiza las fichas para determinar que hay Gramo estructura amática
  • genera el código de bytes, dependiendo del resultado de los análisis

Así que la forma más fácil de entender que esto es sólo porque el guión no es multiproceso no significa su procesado en una ejecución en línea.

PHP Lee todo el código fuente en tokens antes de que se ejecute, para ello tiene que controlar primero el orden de los tokens.

Tome este ejemplo

while(true) 
{ 
    print '*'; 
} 

Cada línea es una secuencia de caracteres, por lo que PHP interpretaría esto como

if   #T_IF 
      #T_WHITESPACE 
(
      #T_WHITESPACE 
true  #T_STRING 
      #T_WHITESPACE 
) 
      #T_WHITESPACE 
{ 
      #T_WHITESPACE 
print  #T_PRINT 
      #T_WHITESPACE 
'*';  #T_CONSTANT_ESCAPED_STRING 
      #T_WHITESPACE 
} 

pero sólo porque su sido leídos no significa que sus sido ejecutados.

De modo que las funciones estén en la parte superior de la lista, de esta manera puede ejecutarlas porque ya están dentro de la memoria del sistema.

Creo que la razón de esto es que la biblioteca nativa de PHP como PFO, mysql_connect y las clases se cargan primero, y mueven todos los ámbitos definidos por el usuario para que se carguen luego de las implementaciones nativas.

cargado al principio de la ejecución.

Cuestiones relacionadas