web-dev-qa-db-fra.com

PHP accéder à la variable globale en fonction

Selon la plupart des règles de portée des langages de programmation, je peux accéder aux variables définies en dehors de leurs fonctions, mais pourquoi ce code ne fonctionne-t-il pas?

<?php
$data = 'My data';

function menugen(){   
    echo "[".$data."]";
}

menugen();
?>

Il y a [] en sortie.

61
Amin Gholibeigian

Cela ne fonctionne pas parce que vous devez pour déclarer les variables globales auxquelles vous allez accéder:

$data = 'My data';

function menugen() {
    global $data; // <-- add this line

    echo "[".$data."]";
}

menugen();

sinon vous pouvez y accéder en tant que $GLOBALS['data'], voir http://php.net/manual/fr/language.variables.scope.php

Même si un peu d'OT, je vous suggère d'éviter d'utiliser des globaux et préférez passer en tant que paramètres.

120
Matteo Tassinari

Vous pouvez effectuer l’une des opérations suivantes:

<?php
$data='My data';
function menugen(){
    global $data;
    echo "[".$data."]";
}
menugen();

Ou

<?php
$data='My data';
function menugen(){
    echo "[".$GLOBALS['data']."]";
}
menugen();

Cela étant dit, la surutilisation de globals peut conduire à un code médiocre. Il est généralement préférable de transmettre ce dont vous avez besoin. Par exemple, au lieu de référencer un objet de base de données global, vous devez transmettre un descripteur à la base de données et agir en conséquence. Ceci s'appelle l'injection de dépendance. Votre vie est beaucoup plus facile lorsque vous implémentez des tests automatisés (ce que vous devriez faire).

13
jcbwlkr

C'est une question de portée. En bref, il faut éviter les variables globales SO:

Vous devez soit le passer en paramètre:

$data = 'My data';

function menugen($data)
{
    echo $data;
}

OU l'avoir dans une classe et y accéder

class MyClass
{
    private $data = "";

    function menugen()
    {
        echo this->data;
    }

}

Éditer: voir la réponse de @MatteoTassinari de même que vous pouvez le marquer comme global pour y accéder, mais les vars globaux ne sont généralement pas nécessaires; il serait donc sage de repenser votre codage.

7
webnoob

Une autre façon de le faire:

<?php

$data = 'My data';

$menugen = function() use ($data) {

    echo "[".$data."]";
};

$menugen();
4
donvercety

Si vous le souhaitez, vous pouvez utiliser la fonction "define" mais cette fonction crée des constantes qui ne peuvent pas être modifiées une fois définies.

<?php
define("GREETING", "Welcome to W3Schools.com!");

function myTest() {
    echo GREETING;
}

myTest();
?>

http://www.w3schools.com/php/php_constants.asp

0
Mohamad Hamouday

Pendant de nombreuses années, j'ai toujours utilisé ce format:

   <?php
     $data = "Hello";

     function sayHello(){
       echo $GLOBALS["data"];
     }

    sayHello();

   ?>

Je le trouve simple et facile à suivre. Le $ GLOBAL est le moyen par lequel PHP vous permet de référencer une variable globale. Si vous avez utilisé des éléments tels que $ _SERVER, $ _POST, etc., vous devez référencer une variable globale sans le savoir.

0
Psalms Kalu

Vous devez passer la variable dans la fonction:

$data = 'My data';

function menugen($data)
{
    echo $data;
}
0
Major Productions