web-dev-qa-db-fra.com

les variables globales en php ne fonctionnent pas comme prévu

J'ai des problèmes avec les variables globales en php. J'ai un $screen var défini dans un fichier, ce qui nécessite un autre fichier qui appelle un initSession() défini dans un autre fichier. La initSession() déclare global $screen et traite ensuite l'écran de 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 la 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" 

Mettre à jour:
Si je déclare à nouveau $screen global juste avant d'avoir besoin du deuxième modèle, $ screen est mis à jour correctement pour la méthode initSession(). Étrange.

25
Josh Smeaton

Global NE REND PAS la variable globale. Je sais que c'est compliqué :-)

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

PAR EXEMPLE :

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

61
e-satis

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 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.

15
Athena

Si vous souhaitez accéder à un grand nombre de variables au cours d'une tâche qui utilise plusieurs fonctions, envisagez de créer un objet 'contexte' pour contenir le contenu:

//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 passer 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 propres. Il est également facile de remplacer ultérieurement le StdClass vide par une classe contenant des méthodes pertinentes.

4
Internet Friend

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

4
finnw

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 essayer d'utiliser le tableau $ GLOBALS à la place.

1
zobier

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

0
Brynner Ferreira

Il est inutile jusqu'à ce qu'il soit 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, il n’est pas utile d’utiliser Global.

0
user3651145