2008-09-20 11 views
24

Tengo problemas con las variables globales en php. Tengo un conjunto $screen var en un archivo, que requiere otro archivo que llama a initSession() definido en otro archivo. El initSession() declara global $screen y luego procesa $ pantalla más abajo utilizando el valor establecido en el primer script.variables globales en php que no funcionan como se esperaba

¿Cómo es esto posible?

Para hacer las cosas más confusas, si intenta establecer $ pantalla nuevamente y luego llama al initSession(), usa el valor que se usó una vez más. El siguiente código describirá el proceso. ¿Podría alguien intentar explicar esto?

$screen = "list1.inc";   // From model.php 
require "controller.php";   // From model.php 
initSession();     // From controller.php 
global $screen;     // From Include.Session.inc 
echo $screen; // prints "list1.inc" // From anywhere 
$screen = "delete1.inc";   // From model2.php 
require "controller2.php"   
initSession(); 
global $screen; 
echo $screen; // prints "list1.inc" 

Actualización:
Si Declaro $screen mundial de nuevo justo antes de requerir el segundo modelo, la pantalla se actualiza $ adecuadamente para el método initSession(). Extraño.

+3

'global $ a;' es equivalente a '$ a = & $ GLOBALS ['a'];'. Es decir, crea una referencia en el ámbito local con el mismo nombre. Fuera de una función, siempre estás en el alcance global. PHP no proporciona un "alcance de archivo". – Matthew

Respuesta

58

Global NO hace que la variable sea global. Sé que es complicado :-)

Global dice que una variable local será utilizado como si fuera una variable con un alcance superior.

por ejemplo:

<?php 

$var = "test"; // this is accessible in all the rest of the code, even an included one 

function foo2() 
{ 
    global $var; 
    echo $var; // this print "test" 
    $var = 'test2'; 
} 

global $var; // this is totally useless, unless this file is included inside a class or function 

function foo() 
{ 
    echo $var; // this print nothing, you are using a local var 
    $var = 'test3'; 
} 

foo(); 
foo2(); 
echo $var; // this will print 'test2' 
?> 

Tenga en cuenta que VARs globales son rara vez es una buena idea. Puede codificar 99.99999% del tiempo sin ellos y su código es mucho más fácil de mantener si no tiene ámbitos difusos. Evita global si puedes.

+0

Estoy completamente de acuerdo con evitar global 'si puedes'. Este código formaba parte de un marco que intentábamos ampliar un poco, por lo que no pudimos evitar los globales, ya que no los pusimos allí. –

+0

¿Esto es cierto para las clases? – Snymax

+0

globales son muy útiles para secuencias de comandos simples, sin embargo. Esp. si tiene configuraciones y OO no es apropiado. –

4

Debe colocar "global $ screen" en cada función que lo haga referencia, no solo en la parte superior de cada archivo.

1

El alcance global abarca archivos incluidos y necesarios, no es necesario utilizar la palabra clave global a menos que se use la variable desde dentro de una función. Podría intentar usar la matriz $ GLOBALS en su lugar.

15

global $foo no significa "hacer que esta variable sea global, para que todos puedan usarla". global $foo significa "dentro del alcance de esta función, utilice la variable global $foo".

Supongo por su ejemplo que cada vez se refiere a $ pantalla desde dentro de una función. Si es así, deberá usar global $screen en cada función.

4

Si usted tiene una gran cantidad de variables que desea acceder durante una tarea que utiliza muchas funciones, considerar la posibilidad de un objeto 'contexto' para mantener las cosas:

//We're doing "foo", and we need importantString and relevantObject to do it 
$fooContext = new StdClass(); //StdClass is an empty class 
$fooContext->importantString = "a very important string"; 
$fooContext->relevantObject = new RelevantObject(); 

doFoo($fooContext); 

Ahora sólo tiene que pasar este objeto como un parámetro a todas las funciones. No necesitará variables globales y sus firmas de funciones se mantendrán limpias. También es fácil reemplazar el StdClass vacío con una clase que realmente tenga métodos relevantes.

0

Debe declarar una variable como global antes de definir valores para ella.

+0

¿Qué agrega tu respuesta a la respuesta previamente aceptada y altamente votada? ¿Desea comentar y agregar un código de muestra? – Yaroslav

0

Es inútil hasta que esté en la función o en una clase. Global significa que puede usar una variable en cualquier parte del programa.Entonces, si el global no está contenido en la función o en una clase, no se puede usar Global

Cuestiones relacionadas