2008-09-20 7 views
24

Ich habe Probleme mit globalen Variablen in PHP. Ich habe eine $screen Var in einer Datei, die eine andere Datei erfordert, die eine initSession() in einer anderen Datei definiert. Die initSession() deklariert global $screen und verarbeitet $ Bildschirm weiter unten mit dem Wert im ersten Skript festgelegt.globale Variablen in PHP nicht wie erwartet funktioniert

Wie ist das möglich?

Um die Dinge verwirrender zu machen, wenn Sie versuchen, $ Bildschirm wieder zu setzen, dann rufen Sie die initSession(), es verwendet den zuerst verwendeten Wert noch einmal. Der folgende Code beschreibt den Prozess. Könnte jemand das erklären?

$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" 

Update:
Wenn ich erklären $screen global wieder kurz vor dem zweiten Modell erfordert, wird $ Bildschirm richtig für die initSession() Methode aktualisiert. Seltsam.

+3

'global $ a;' nicht äquivalent zu $ ​​a = & $ GLOBALS ['a']; '. Das heißt, es wird eine Referenz im lokalen Bereich mit demselben Namen erstellt. Außerhalb einer Funktion sind Sie immer im globalen Bereich. PHP bietet keinen "Dateiumfang". – Matthew

Antwort

58

Global macht die Variable nicht global. Ich weiß, es ist knifflig :-)

Global sagt, dass eine lokale Variable verwendet wird, als ob es eine Variable mit einem höheren Bereich war.

z.B:

<?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' 
?> 

Hinweis, dass die globale Vars ist selten eine gute Idee. Sie können 99.99999% der Zeit ohne sie programmieren und Ihr Code ist viel einfacher zu pflegen, wenn Sie keine unscharfen Bereiche haben. Vermeiden Sie global, wenn Sie können.

+0

Ich stimme voll und ganz mit der Vermeidung von globalen "wenn du kannst". Dieser Code war Teil eines Frameworks, um dessen Erweiterung wir uns bemühten, so dass wir Globals nicht vermeiden konnten, da wir sie nicht dort platziert haben. –

+0

gilt das für Klassen? – Snymax

+0

globals sind jedoch sehr nützlich für einfaches Scripting. Esp. wenn Sie Konfigurationen haben und OO nicht geeignet ist. –

4

Sie müssen "global $ screen" in jede Funktion einfügen, die darauf verweist, nicht nur am Anfang jeder Datei.

1

Der globale Gültigkeitsbereich umfasst eingeschlossene und erforderliche Dateien. Sie müssen das globale Schlüsselwort nur verwenden, wenn Sie die Variable innerhalb einer Funktion verwenden. Sie könnten stattdessen versuchen, das $ GLOBALS-Array zu verwenden.

15

global $foo bedeutet nicht "mache diese Variable global, so dass jeder sie verwenden kann". global $foo bedeutet "im Rahmen dieser Funktion, verwenden Sie die globale Variable $foo".

Ich gehe von Ihrem Beispiel aus, dass Sie jedes Mal $ innerhalb einer Funktion betrachten. Wenn dies der Fall ist, müssen Sie global $screen in jeder Funktion verwenden.

4

Wenn Sie haben eine Menge von Variablen, die Sie während einer Aufgabe zugreifen möchten, die viele Funktionen verwendet, sollten Sie einen ‚Kontext‘ Objekt machen, das Zeug zu halten:

//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); 

Jetzt passieren nur dieses Objekt als Parameter zu allen Funktionen. Sie benötigen keine globalen Variablen und Ihre Funktionssignaturen bleiben sauber. Es ist auch einfach, später die leere StdClass durch eine Klasse zu ersetzen, die tatsächlich relevante Methoden enthält.

0

Sie müssen eine Variable als global definieren, bevor Sie Werte dafür definieren.

+0

Was fügt Ihre Antwort zu der zuvor angenommenen und hoch bewerteten Antwort hinzu? Möchten Sie kommentieren und einen Beispielcode hinzufügen? – Yaroslav

0

Es ist nutzlos, bis es in der Funktion oder einer Klasse ist. Global bedeutet, dass Sie eine Variable in einem beliebigen Teil des Programms verwenden können.Wenn also das globale Element nicht in der Funktion oder Klasse enthalten ist, ist die Verwendung von Global