le variabili globali in php non funzionano come previsto
Domanda
Sto riscontrando problemi con le variabili globali in php. Ho un var $ screen
impostato in un file, che richiede un altro file che chiama un initSession ()
definito in un altro file. initSession ()
dichiara global $ screen
e quindi elabora $ screen più in basso utilizzando il valore impostato nel primo script.
Come è possibile?
Per rendere le cose più confuse, se si tenta di impostare nuovamente $ screen, quindi chiamare initSession ()
, utilizza il valore utilizzato per la prima volta. Il codice seguente descriverà il processo. Qualcuno potrebbe provare a spiegarlo?
$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"
Aggiornamento:
Se dichiaro nuovamente $ screen
appena prima di richiedere il secondo modello, $ screen viene aggiornato correttamente per il metodo initSession ()
. Strano.
Soluzione
Global
NON rende la variabile globale. So che è difficile :-)
Global
afferma che verrà utilizzata una variabile locale come se fosse una variabile con un ambito superiore .
E.G:
<?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'
?>
Nota che raramente i var globali sono una buona idea. Puoi codificare il 99,99999% delle volte senza di loro e il tuo codice è molto più facile da mantenere se non hai ambiti fuzzy. Evita globale
se puoi.
Altri suggerimenti
global $ foo
non significa " rendere globale questa variabile, in modo che tutti possano usarla " ;. global $ foo
significa " nell'ambito di questa funzione , usa la variabile globale $ foo
" ;.
Presumo dal tuo esempio che ogni volta ti riferisci a $ screen da una funzione. In tal caso, dovrai utilizzare global $ screen
in ogni funzione.
Devi inserire " global $ screen " in ogni funzione che lo fa riferimento, non solo nella parte superiore di ogni file.
Se hai molte variabili a cui vuoi accedere durante un'attività che utilizza molte funzioni, considera l'idea di creare un oggetto 'contesto' per contenere le cose:
//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);
Ora passa questo oggetto come parametro a tutte le funzioni. Non avrai bisogno di variabili globali e le firme delle tue funzioni rimarranno pulite. È anche facile sostituire successivamente la StdClass vuota con una classe che contiene effettivamente metodi pertinenti.
L'ambito globale abbraccia i file inclusi e richiesti, non è necessario utilizzare la parola chiave globale a meno che non si usi la variabile all'interno di una funzione. Potresti invece provare a usare l'array $ GLOBALS.
Devi dichiarare una variabile come globale prima di definirne i valori.
È inutile finché non è nella funzione o in una classe. Globale significa che è possibile utilizzare una variabile in qualsiasi parte del programma. Quindi, se il globale non è contenuto nella funzione o in una classe, non è possibile utilizzare Global