web-dev-qa-db-fra.com

Déclarer un tableau global

Salut. J'ai récemment appris PHP et j'essaie de déclarer un tableau global pour pouvoir accéder à une fonction. Mais il me semble manquer quelque chose parce que je reçois l'erreur 'Variable non définie:' 

Voici mon code:

global $second_array;
$second_array = array();

function operatii($v) {
  $var1 = $second_array[count($second_array)-1];
  $var2 = $second_array[count($second_array)-2];
  $rez = null;

  echo $var1 . $var2 . "este?";
}

for ($i = 0; $i < count($a); $i++){
  if ($a[$i] === "+" || $a[$i] === "-" || $a[$i] === "*" || $a[$i] === "/" ) {
    operatii($a[$i]);
  } else {
    array_Push($second_array, $a[$i]);
  }
}

Il semble que je puisse utiliser le $second_array dans la boucle for, mais je ne peux pas l'utiliser dans la fonction operatii.
Comment puis-je résoudre ce problème?

14
Nistor Alexandru

Il existe deux manières de référencer une variable globale en PHP:

  1. Utilisez le mot clé global au début de chaque fonction utilisant la variable.
  2. Utilisez le tableau $GLOBALS.

Parmi ceux-ci, je vous recommande de vous en tenir à la seconde, car cela indique clairement à tout moment que la variable est globale.

L'un des problèmes des globals est de savoir où ils sont utilisés. L'utilisation du tableau $GLOBALS atténue ce problème dans une certaine mesure.

Cependant, l'utilisation de globals pose toujours des problèmes. Il est généralement considéré comme une mauvaise pratique d’utiliser trop de globals dans votre code. Ayant travaillé avec un certain nombre de systèmes hérités qui utilisaient largement les globals, je peux affirmer qu'ils peuvent causer beaucoup de maux de tête aux futurs développeurs.

L'utilisation de globals rend également plus difficile la rédaction de suites de tests formelles pour votre code (par exemple, les tests unitaires).

Ma recommandation serait donc d'éviter d'utiliser des globals autant que possible. Elles sont nécessaires dans certains cas, mais plus vous pourrez les éviter et transmettre des variables à vos fonctions et classes plutôt que de les rendre globales, plus les choses iront bien.

Donc, pour résumer:

Si vous devez utiliser des globales, référencez-les avec $GLOBALS['varname'], mais il est généralement préférable de ne pas les utiliser du tout.

J'espère que cela pourra aider.

16
Spudley

Comme à propos de tout le monde suggéré, vous devriez passer votre tableau comme paramètre de fonction. L'utilisation de globals est une mauvaise pratique dans les cas les plus graves.

            function operatii($second_array, $v) {
                $var1 = $second_array[count($second_array)-1];
                $var2 = $second_array[count($second_array)-2];
                $rez = null;
                echo $var1 . $var2 . "este?";
            }

            $second_array = array();

            for ($i = 0; $i < count($a); $i++) {
                if ($a[$i] === "+" || $a[$i] === "-" || $a[$i] === "*" || $a[$i] === "/" ) {
                    operatii($second_array, $a[$i]);
                } else {
                    array_Push($second_array, $a[$i]);
                }
            }
6
Alain Tiemblo

Pour quiconque pose cette vieille question dans une recherche google,

Dans l'exemple, la variable $ second_array a été déclarée globale et non le tableau créé à la ligne suivante. Pour éviter cela assurez-vous que la déclaration globale vient après la déclaration de tableau . Ma préférence est de mettre la déclaration globale dans la fonction elle-même. 

$second_array = array();

function operatii($v) {

    global $second_array;  

    $var1 = $second_array[count($second_array)-1];
    $var2 = $second_array[count($second_array)-2];
    $rez = null;

    echo $var1 . $var2 . "este?";
}

for ($i = 0; $i < count($a); $i++){
    if ($a[$i] === "+" || $a[$i] === "-" || $a[$i] === "*" || $a[$i] === "/" ) {
        operatii($a[$i]);
    } else {
        array_Push($second_array, $a[$i]);
    }
}
2
Neil Richins