2010-04-21 14 views
13

Pregunta simple: ¿Es el alcance de require_once global?¿Cuál es el alcance de require_once en PHP?

Por ejemplo:

<?PHP 

require_once('baz.php'); 

// do some stuff 
foo ($bar); 

function foo($bar) { 
    require_once('baz.php'); 
    // do different stuff 
} 

?> 

Cuando se llama foo, lo hace re-análisis sintáctico baz.php? ¿O se basa en el archivo ya requerido del archivo php principal (análogo a llamar require_once dos veces consecutivas para el mismo archivo include)?

vi este hilo antes, pero no acababa de responder a la pregunta:

Should require_once "some file.php" ; appear anywhere but the top of the file?

Gracias por su ayuda!

Respuesta

6

require_once() básicamente depende del archivo físico para determinar si se ha incluido o no. Por lo tanto, no es tanto el contexto al que llama al require_once(), sino también si ese archivo físico ya se había requerido anteriormente.

En su código anterior, su función foo() no volvería a analizar baz.php, ya que será el mismo archivo que se incluyó anteriormente en la parte superior.

Sin embargo, obtendrá resultados diferentes en función de si lo incluyó dentro de foo(), o lo incluyó en la parte superior, ya que el alcance se aplicará cuando require_once() tenga éxito.

+0

Genial, gracias a todos por sus respuestas. – TMG

2

Para responder más específicamente a su pregunta, la segunda vez que llame al require_once en ese archivo, no hará nada, porque ya está incluido.

Si su inclusión tiene funciones, etc. en ella, entonces tendría problemas incluyéndolo dentro de una función de todos modos, por lo que el alcance es irrelevante. Si solo se trata de variables definidas o procesadas, puede usar require en lugar de require_once si desea que se incluya nuevamente, redefiniendo de ese modo las variables en su ámbito.

5

No es así. El seguimiento de require_once se aplica a las funciones internas. Sin embargo, las siguientes secuencias de comandos producen un error:

a.php

<?php 
require_once('b.php'); 
function f() { require_once('b.php'); echo "inside function f;"; } 
?> 

b.php

<?php 
f(); 
?> 

porque la función f() no se pre-definida para b.php.

Cuestiones relacionadas