Pasar una variable de un archivo de inclusión php a otro: global vs.no


76

Estoy intentando pasar una variable de un archivo de inclusión a otro. Esto NO funciona a menos que declare la variable como global en el segundo archivo de inclusión. Sin embargo, NO necesito declararlo como global en el archivo que llama a la primera inclusión. Por ejemplo:


front.inc:

$name = 'james';

index.php:

include('front.inc');
echo $name;
include('end.inc');

salida: james


end.inc:

echo $name;

salida: nada


SI declaro global $ name antes de hacer eco de $ name en end.inc, entonces funciona correctamente. La respuesta aceptada a esta publicación explica que esto depende de la configuración de su servidor: Pasar variables en PHP de un archivo a otro

Estoy usando un servidor Apache. ¿Cómo lo configuraría para que no sea necesario declarar $ name como global? ¿Hay ventajas / desventajas de uno frente al otro?


2
incluye no son funciones similares. incluye no rompen el alcance de la variable. es como si copiara y pegara el contenido de los archivos de inclusión directamente en el script de llamada.
dqhendricks

2
¿Está el eco en end.inc dentro de una función?
dqhendricks

2
eso rompería el alcance variable. y en ese caso probablemente debería pasar $ name a la función en un argumento.
dqhendricks

¡Esto debería funcionar como está escrito!
diciembre

el eco en end.inc no está dentro de una función. Suponga que los tres archivos que describí anteriormente contienen ni más ni menos que exactamente lo que escribí.
maxedison

Respuestas:


62

Cuando se incluyen archivos en PHP, actúa como si el código existiera dentro del archivo desde el que se incluyen. Imagínese copiar y pegar el código desde cada uno de sus archivos incluidos directamente en su index.php. Así es como funciona PHP con includes.

Entonces, en su ejemplo, dado que estableció una variable llamada $nameen su front.incarchivo, y luego incluyó ambos front.incy end.incen su index.php, podrá usar echola variable en $namecualquier lugar después includede front.incdentro de su index.php. Nuevamente, PHP procesa su index.phpcomo si el código de los dos archivos que está incluyendo fuera parte del archivo.

Cuando coloca un echodentro de un archivo incluido, en una variable que no está definida dentro de sí misma, no obtendrá un resultado porque se trata por separado que cualquier otro archivo incluido.

En otras palabras, para realizar el comportamiento que espera, deberá definirlo como global.


51
Su respuesta parece contradecirse. Dijo un par de veces que incluir un archivo es lo mismo que si todo el código fuera simplemente parte de un archivo. Por lo tanto, lo que describí en mi publicación sería equivalente a: $ nombre = 'james'; echo $ nombre; echo $ nombre; - Eso debería producir jamesjames. Pero su penúltimo párrafo contradice lo que acabo de describir. Quizás lo que quiere decir es que SÓLO el archivo que realiza la llamada de inclusión tiene acceso a las variables del archivo incluido, por lo que otros archivos incluidos NO tienen acceso a esas variables. ¿Es eso correcto?
Maxedison

24
Sí, eso suena correcto. Lo siento si lo que dije fue confuso. Lo edité como 5 veces porque me estaba costando mucho describir el proceso sin perderte. Por lo tanto, el archivo principal tiene acceso a las variables en ambos archivos incluidos, pero el archivo incluido no tiene acceso al otro archivo incluido. Si eso tiene algún sentido.
Michael Irigoyen

Además de la respuesta aceptada, su corrección también es incorrecta (o desactualizada). En PHP7 (al menos) puedo definir una variable included1.phpy hacer referencia a ella más adelante included2.phpsin hacer referencia a ella parent.php, y obtener el valor que definí included1.php. Sigo las mismas reglas de alcance que seguiría si el código estuviera todo en una sola página. Nada mas.
pila de galletas

3
Votado en contra porque los dos primeros párrafos contradicen explícitamente la siguiente oración.
Joshua Flood

En resumen: arroje su archivo incluido a una función y pase las variables necesarias como parámetros. Es desagradable pero funciona. 😒︀
John

32

Aquí hay una trampa que evitar. En caso de que necesite acceder a su variable $ nombre dentro de una función, debe decir "global $ name;" al comienzo de esa función. Debe repetir esto para cada función en el mismo archivo.

include('front.inc');
global $name;

function foo() {
  echo $name;
}

function bar() {
  echo $name;
}

foo();
bar();

solo mostrará errores. La forma correcta de hacerlo sería:

include('front.inc');

function foo() {
  global $name;
  echo $name;
}

function bar() {
  global $name;
  echo $name;
}

foo();
bar();

En otras palabras: escribe global $varantes de usarlo en otra función.
Chris Happy

2

Esto es todo lo que tienes que hacer:

En frente.inc

global $name;
$name = 'james';

2
Agregue una explicación con la respuesta de cómo esta respuesta ayuda a OP a solucionar el problema actual
ρяσѕρєя K

1
Tuve el mismo problema descrito por maxedison. También me confundí con muchas respuestas: "el proceso php incluye como copiar y pegar ..." lo cual no es cierto y gracias a la explicación de Michael en su respuesta, entiendo que el código en el archivo incluido no reconoce la variable global definida en el archivo de inclusión anterior . En mis experimentos también descubrí que si uso la palabra clave "global" en el primer iclude puedo corregir esto, como respondió Paul. Pero, ¿dónde puedo encontrar ambos casos descritos en la documentación de PHP? Y la segunda pregunta es si ambos no son ciertos solo en alguna versión de PHP.
StackPeter
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.