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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top