Comment déclarer une variable globale en php?


168

J'ai du code quelque chose comme ça:

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

y a-t-il un moyen de définir la variable globale en un seul endroit et de rendre la variable $aaccessible dans toutes les fonctions à la fois? sans faire usage de global $a;plus?


15
Non, il n'y en a pas. Si vous n'aimez pas le globalmot - clé, envisagez d'utiliser le $GLOBALS['a']superglobal dans toutes les étendues ou envisagez de passer le paramètre à vos fonctions.
Michael Berkowski

5
Si c'est quelque chose d'important, alors même une variable de session peut être utilisée.
Nikos Tsirakis

Réponses:


259

Le $GLOBALStableau peut être utilisé à la place:

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

À partir du manuel :

Un tableau associatif contenant des références à toutes les variables qui sont actuellement définies dans la portée globale du script. Les noms de variables sont les clés du tableau.


Si vous avez un ensemble de fonctions qui nécessitent des variables communes, une classe avec des propriétés peut être un bon choix au lieu d'un global:

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);

78

Si la variable ne change pas, vous pouvez utiliser define

Exemple:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');

function footer()
{
    echo FOOTER_CONTENT;
}

2
Que se passe-t-il lorsque l' FOOTER_CONTENTon tente de modifier? Est-ce juste comme finalen Java ou consten C, C ++ et C #?
Lion

4
Si vous essayez de définir FOOTER_CONTENT une deuxième fois, php lancera un avis à ce sujet
Dale

J'avais besoin de calculer l'heure actuelle de l'époque Unix à chaque fois qu'une page est chargée, puis d'utiliser cette valeur dans quelques calculs (fonctions). "définir" a fonctionné pour moi. Au départ, je n'ai pas vu que "echo FOOTER_CONTENT;" n'avait pas de «$» précédent et j'ai eu des erreurs.
user208145

Si la variable ne va pas changer, ce n'est pas une variable. N'est-ce pas?!
Sajidur Rahman

29

Ajoutez vos variables dans le tableau super global $ GLOBALS comme

$GLOBALS['variable'] = 'localhost'; 

et l'utiliser dans le monde

ou vous pouvez utiliser des constantes accessibles tout au long du script

define('HOSTNAME', 'localhost');  

1
Si vous utilisez «définir», une fois défini, vous ne pouvez pas modifier un définir!
Reza MA

dans votre premier exemple, il est dit que la '$ variable s'appelle maintenant' localhost 'plus tard dans le script?
Zach Smith

non si vous voulez utiliser cette variable, vous devez l'utiliser comme $ GLOBALS ['variable'];
Pankaj Khairnar

25

Si une variable est déclarée en dehors d'une fonction, elle est déjà dans la portée globale. Il n'y a donc pas besoin de déclarer. Mais d'où vous appelez cette variable doit avoir accès à cette variable. Si vous appelez de l'intérieur d'une fonction, vous devez utiliser le globalmot clé:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

L'utilisation d'un mot clé global en dehors d'une fonction n'est pas une erreur. Si vous souhaitez inclure ce fichier dans une fonction, vous pouvez déclarer la variable comme global.

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

Vous pouvez également utiliser $GLOBALS. C'est un super-mondial donc il a accès partout.

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

Selon votre choix, vous pouvez choisir l'un ou l'autre.


9

Cette réponse est très tardive, mais ce que je fais, c'est définir une classe qui contient des booléens, des tableaux et des valeurs initiales entières en tant que variables statiques de portée globale. Toutes les chaînes constantes sont définies comme telles.

define("myconstant", "value"); 

class globalVars {

    static $a = false;

    static $b = 0;

    static $c = array('first' => 2, 'second' => 5);

}


function test($num) {

    if (!globalVars::$a) {

        $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';

        globalVars::$a = true;

    } else {

        $returnVal = 'I forgot';

    }

    return $returnVal;

}

echo test(9); ---> The value of 9 + 0 + 5 is 14.

echo "<br>";

echo globalVars::$a; ----> 1

Les staticmots-clés doivent être présents dans la classe, sinon les vars $ a, $ b et $ c ne seront pas globalement étendus.


C'est une bonne solution pour de nombreuses raisons. La classe static ne nécessite que quelques caractères ajoutés au nom de la variable de base: G :: $ Name, où la déclaration ressemble à ceci: class G {static $ Name, $ Name2;} Notez que G peut être des variables vraiment globales, alors E pourrait être utilisé pour les variables relatives aux salariés. C'est plus facile à programmer que le paradigme orienté objet à grande échelle pris en charge par PHP. Si des constantes sont vraiment nécessaires, vous pouvez les déclarer après "const" tout comme les variables déclarées après "static" - laissez simplement de côté les signes dollar. G :: Example serait un exemple de constante globale.
David Spector

5

Vous avez répondu à cette question dans la manière dont vous avez écrit la question - utilisez «définir». mais une fois défini, vous ne pouvez pas modifier une définition.

Alternativement, il existe des astuces avec une constante dans une classe, comme class :: constant que vous pouvez utiliser. Vous pouvez également les rendre variables en déclarant des propriétés statiques à la classe, avec des fonctions pour définir la propriété statique si vous souhaitez la modifier.


5

Vous pouvez essayer le mot-clé usedans les fonctions de fermeture ou Lambdas si cela correspond à votre intention ... PHP 7.0 cependant. Ce n'est pas mieux, mais juste une alternative.

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");

démo | Info


1

Pensons un peu différemment:

class globe{
    static $foo = "bar";
}

Et vous pouvez l'utiliser et le modifier comme vous le souhaitez, comme:

function func(){
    echo globe::$foo;
}

0

Que faire si vous utilisez une fonction procédurale au lieu de variable et que vous les appelez n'importe où comme vous.

Je fais généralement une collection de valeurs de configuration et les mets dans une fonction avec une déclaration de retour. J'inclus simplement cela là où je dois utiliser la valeur globale et appeler une fonction particulière.

function host()
{
   return "localhost";
}

-1

$GLOBALS[] est la bonne solution, mais puisque nous parlons d'alternatives, une fonction peut aussi faire ce travail facilement:

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}

Ici, la fonction n'est pas une variable globale.
Pratik Soni il y a

-19

Vous ne devriez plus utiliser de globaux, ils ne sont pas disponibles en PHP 5.4.


19
REGISTER GLOBALS est supprimé. pas des globaux.
unity100

7
Cette réponse, telle que rédigée, est fausse et devrait être mise à jour pour refléter le commentaire de unity100. Si GLOBALS est toujours disponible, veuillez préciser quels aspects de GLOBAL vars ont changé. Quelque chose comme ça.
crashwap


@RobertColumbia Article très intéressant, et je le garderai à l'esprit pour d'autres réponses, mais cela ne s'applique pas dans ce cas particulier. (J'espère que vous utilisez simplement cette méta pour montrer comment une réponse "ne faites pas ça" peut être valide et non pas comme une justification que celle-ci est;)) " " Ne faites pas ça " peut être une réponse valide . "-" peut être "non" est ". " Mais parfois, rien ne doit être fait à la place. Si vous arrêtez simplement de faire la mauvaise chose, tout recommencera à fonctionner comme par magie. " - Ne s'applique pas ici car le code n'est pas "cassé". Le PO veut juste une façon de faire les choses "moins typée". …
robinCTS

" essaie- t -il réellement de répondre à la question? Dans la plupart des cas, c'est le cas. " - "La plupart", pas "tous". (Je contesterais même le «plus», mais je n'ai pas vu assez de réponses pour faire un argument éclairé.). " Dans ce cas, ce n'est pas. " - Et dans cette "réponse" ce n'est pas aussi, pour les mêmes raisons: " Pire, la réponse de Murphy ne propose pas de solution au problème. " Et " Ça ne donne pas le demandeur un outil ou une méthode ou quoi que ce soit qui ressemble à une solution à son problème ». …
robinCTS
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.