Question

J'ai des problèmes avec les variables globales en php. J'ai une $ screen var définie dans un fichier, ce qui nécessite un autre fichier qui appelle un initSession () défini dans un autre fichier. initSession () déclare global $ screen , puis traite l'écran $ plus bas en utilisant la valeur définie dans le tout premier script.

Comment est-ce possible?

Pour rendre les choses plus confuses, si vous essayez de redéfinir $ screen puis appelez le initSession () , il utilisera la valeur utilisée une nouvelle fois. Le code suivant décrira le processus. Quelqu'un pourrait-il essayer d'expliquer cela?

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

Mise à jour:
Si je déclare $ screen à nouveau global juste avant d'exiger le second modèle, $ screen est mis à jour correctement pour la méthode initSession () . Étrange.

Était-ce utile?

La solution

Global NE rend PAS la variable globale. Je sais que c'est délicat: -)

Global indique qu'une variable locale sera utilisée comme s'il s'agissait d'une variable de portée supérieure .

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

Notez que les vars globaux sont rarement une bonne idée. Vous pouvez coder 99,99999% du temps sans eux et votre code est beaucoup plus facile à gérer si vous n'avez pas d'étendue floue. Évitez global si vous le pouvez.

Autres conseils

global $ foo ne signifie pas "rendre cette variable globale, afin que tout le monde puisse l'utiliser". global $ foo signifie " dans le cadre de cette fonction , utilisez la variable globale $ foo ".

Je suppose, à partir de votre exemple, qu'à chaque fois, vous faites référence à $ screen depuis une fonction. Si tel est le cas, vous devrez utiliser global $ screen dans chaque fonction.

Vous devez insérer " global $ screen " dans chaque fonction qui y fait référence, pas seulement en haut de chaque fichier.

Si vous souhaitez accéder à un grand nombre de variables au cours d'une tâche utilisant de nombreuses fonctions, envisagez de créer un objet "contexte" pour stocker les éléments:

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

Il suffit maintenant de transmettre cet objet en tant que paramètre à toutes les fonctions. Vous n'aurez pas besoin de variables globales et les signatures de vos fonctions resteront nettes. Il est également facile de remplacer ultérieurement la classe StdClass vide par une classe contenant des méthodes pertinentes.

L'étendue globale s'étend aux fichiers inclus et requis. Vous n'avez pas besoin d'utiliser le mot-clé global sauf si vous utilisez la variable depuis une fonction. Vous pouvez utiliser le tableau $ GLOBALS à la place.

Vous devez déclarer une variable comme globale avant de définir des valeurs pour elle.

Il est inutile tant qu’il est dans la fonction ou dans une classe. Global signifie que vous pouvez utiliser une variable dans n’importe quelle partie du programme. Donc, si le global n'est pas contenu dans la fonction ou une classe, l'utilisation de Global

ne sert à rien.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top