Pregunta

Tengo problemas con las variables globales en php.tengo un $screen var establecido en un archivo, lo que requiere otro archivo que llame a un initSession() definido en otro archivo más.El initSession() declara global $screen y luego procesa $screen más abajo usando el valor establecido en el primer script.

¿Cómo es esto posible?

Para hacer las cosas más confusas, si intenta configurar $screen nuevamente, llame al initSession(), utiliza el valor utilizado por primera vez una vez más.El siguiente código describirá el proceso.¿Alguien podría 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" 

Actualizar:
si declaro $screen global nuevamente justo antes de requerir el segundo modelo, $screen se actualiza correctamente para el initSession() método.Extraño.

¿Fue útil?

Solución

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

Global dice que se utilizará una variable local como si fuera una variable de mayor alcance.

P.EJ :

<?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 las variables globales rara vez son una buena idea.Puedes codificar el 99,99999% del tiempo sin ellos y tu código es mucho más fácil de mantener si no tienes alcances difusos.Evitar global si puedes.

Otros consejos

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

Supongo por tu ejemplo que cada vez te refieres a $screen desde dentro de una función.Si es así necesitarás usar global $screen en cada función.

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

Si tiene muchas variables a las que desea acceder durante una tarea que utiliza muchas funciones, considere crear un objeto de 'contexto' para contener todo:

//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 simplemente pase este objeto como parámetro a todas las funciones.No necesitará variables globales y las firmas de sus funciones se mantendrán limpias.También es fácil reemplazar posteriormente la StdClass vacía con una clase que realmente tenga métodos relevantes.

El alcance global abarca los archivos incluidos y requeridos; no es necesario utilizar la palabra clave global a menos que utilice la variable desde una función.Podrías intentar usar la matriz $GLOBALS en su lugar.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top