Frage

Ich habe Probleme mit globalen Variablen in PHP. Ich habe einen $screen var Satz in einer Datei, die eine andere Datei benötigt, die eine initSession() noch in einer anderen Datei definiert aufruft. Die initSession() erklärt global $screen und verarbeitet dann $ Bildschirm weiter unten den Wert im ersten Skript festgelegt werden.

Wie ist das möglich?

Um die Dinge noch verwirrender zu machen, wenn Sie die initSession() $ Bildschirm wieder ruft dann zu setzen versuchen, verwendet es den Wert zunächst einmal wieder verwendet. Der folgende Code wird den Prozess beschreiben. Könnte jemand mal ran dies zu 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 $screen wieder global deklariere, kurz bevor das zweite Modell erfordern, wird $ Bildschirm richtig für die initSession() Methode aktualisiert. Seltsam.

War es hilfreich?

Lösung

Global nicht die Variable global machen. Ich weiß, es ist schwierig: -)

Global sagt, dass eine lokale Variable verwendet werden als ob es sich um eine Variable mit einem höheren Umfang war .

z:

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

Beachten Sie, dass die globale Vars ist selten eine gute Idee. Sie können, ohne sie zu 99,99999% der Zeit-Code und der Code ist viel einfacher zu pflegen, wenn Sie nicht Fuzzy-Bereiche verfügen. Vermeiden Sie global wenn Sie können.

Andere Tipps

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

ich aus Ihrem Beispiel gehe davon aus, dass jedes Mal, Sie innerhalb einer Funktion auf $ Bildschirm beziehen. Wenn dies der Fall müssen Sie global $screen in jeder Funktion nutzen zu können.

Sie müssen „global $ screen“ in jeder Funktion setzen, die es verweist, nicht nur an der Spitze jeder Datei.

Wenn Sie haben eine Menge von Variablen, die Sie während einer Aufgabe zugreifen möchten, die viele Funktionen verwendet, erwägen, einen ‚Kontext‘ Objekt, 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);

Nun passiert gerade dieses Objekt als Parameter auf alle Funktionen. Sie werden keine globalen Variablen benötigen, und Ihre Funktion Signaturen bleiben sauber. Es ist auch leicht zu später das leere StdClass mit einer Klasse zu ersetzen, die tatsächlich relevanten Methoden in sich hat.

Die globale Reichweite Pannen enthalten und die erforderlichen Dateien, brauchen Sie nicht, es sei denn mit der Variable das Schlüsselwort global zu verwenden, innerhalb einer Funktion. Sie könnten versuchen, den $ GLOBALS Array statt.

Sie müssen eine Variable deklarieren als globale bevor Werte definieren für sie.

Es ist nutzlos, bis es in der Funktion oder eine Klasse ist. Globale bedeutet, dass Sie eine Variable in jedem Teil des Programms verwenden können. Also, wenn die globalen in der Funktion oder eine Klasse enthalten ist, nicht gibt es keine Verwendung von mit globaler

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top