2008-09-20 12 views
24

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

Comment est-ce possible?

Pour rendre les choses plus confuses, si vous essayez de définir à nouveau $ screen, appelez le initSession(), il utilise la valeur d'abord utilisée à nouveau. 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 à nouveau juste avant $screen mondiale nécessitant le second modèle, l'écran $ est correctement mis à jour pour la méthode initSession(). Étrange.

+3

'global $ a;' est équivalent à '$ a = & $ GLOBALS ['a'];'. Autrement dit, il crée une référence dans la portée locale avec le même nom. En dehors d'une fonction, vous êtes toujours dans une portée globale. PHP ne fournit pas de "portée de fichier". – Matthew

Répondre

58

Global NE DONNE PAS à la variable globale. Je sais que c'est difficile :-)

Global indique qu'une variable locale sera utilisée comme s'il s'agissait d'une variable avec une portée plus élevée.

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 vars globales sont rarement une bonne idée. Vous pouvez programmer 99,99999% du temps sans eux et votre code est beaucoup plus facile à maintenir si vous n'avez pas d'étendues floues. Évitez global si vous le pouvez.

+0

Je suis entièrement d'accord avec l'évitement global "si vous le pouvez". Ce code faisait partie d'un cadre que nous essayions de prolonger légèrement, nous n'avons donc pas pu éviter les globales, car nous ne les avons pas mises là. –

+0

est-ce vrai pour les cours? Cependant, les globals – Snymax

+0

sont super utiles pour les scripts simples. Esp. si vous avez des configurations et OO n'est pas approprié. –

4

Vous devez placer "global $ screen" dans toutes les fonctions qui le référencent, pas seulement en haut de chaque fichier.

1

La portée globale inclus et les fichiers requis, vous n'avez pas besoin d'utiliser le mot-clé global sauf si vous utilisez la variable dans une fonction. Vous pourriez essayer d'utiliser le tableau $ GLOBALS à la place.

15

global $foo ne veut pas dire "rendre cette variable globale, pour 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 c'est le cas, vous devrez utiliser global $screen dans chaque fonction.

4

Si vous avez beaucoup de variables que vous voulez accéder au cours d'une tâche qui utilise de nombreuses fonctions, pensez à faire un objet « contexte » de tenir les choses:

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

Maintenant, il suffit de passer cet objet en tant que paramètre à toutes les fonctions. Vous n'aurez pas besoin de variables globales et vos signatures de fonction resteront propres. Il est également facile de remplacer plus tard le StdClass vide par une classe qui contient des méthodes pertinentes.

0

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

+0

Qu'est-ce que votre réponse ajoute à la réponse précédemment acceptée et fortement mise à jour? Voulez-vous commenter et ajouter un exemple de code? – Yaroslav

0

Il est inutile jusqu'à ce qu'il soit dans la fonction ou 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 dans une classe, il n'est pas utile d'utiliser Global

Questions connexes