Les tableaux
<<<
Pourquoi est-ce que $foo[bar] est invalide ? Les tableaux
>>>

4.2.6.3 A faire et à ne pas faire avec les tableaux
4.2.6 Les tableaux
4.2 Les types
4 Référence du langage
 Manuel PHP

->Pourquoi est-ce que $foo[bar] est invalide ?

4.2.6.3.1 Pourquoi est-ce que $foo[bar] est invalide ?

Vous devez toujours utiliser les guillemets autour de la chaîne de caractères placée en tant qu'index du tableau. Par exemple, utilisez $foo['bar'] et non pas $foo[bar] . Mais, pourquoi $foo[bar] est faux ? Vous pourriez avoir vu la syntaxe suivante en vos vieux scripts :
Accès aux index de tableaux, ancienne méthode

<?php
$foo
[bar] = 'ennemi';
echo
$foo[bar];
// etc.
?>
Cela est mauvais, mais ça marche. Pourquoi est-ce mauvais? La raison est que PHP attend une constante entre crochets (bar) plutôt qu'une chaîne ('bar', notez les guillemets). Or, PHP pourrait définir dans le futur des constantes qui, malheureusement pour votre code, auront ce nom. En fait, cela fonctionne car la constante indéfinie est transformée en chaîne ayant la même valeur.

Note

Cela ne signifie pas que vous devez toujours mettre les clés entre guillemets. Vous n'allez pas utiliser les guillemets avec les clés qui sont des constantes ou des variables , car cela empêchera PHP de les interpréter correctement.

Ne pas mettre les clés de tableaux entre guillemets

<?php
error_reporting
(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Tableau simple :
$array = array(1, 2);
$count = count($array);
for (
$i = 0; $i < $count; $i++) {
    echo
"\nChecking $i : \n";
    echo
"Mauvais : " . $array['$i'] . "\n";
    echo
"Bon : " . $array[$i] . "\n";
    echo
"Mauvais : {$array['$i']}\n";
    echo
"Bon : {$array[$i]}\n";
}
?>

D'autres exemples :
Exemples de conflits de constantes indéfinies

<?php
// Affichons toutes les erreurs
error_reporting(E_ALL);

$arr = array('fruit' => 'pomme', 'legume' => 'carotte');

// Correct
print $arr['fruit'];  // pomme
print $arr['legume']; // carotte

// Incorrect.  Cela fonctionne mais PHP affiche une alerte car
// il y a utilisation d'une constante indéfinie appelée fruit
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit];    // pomme

// Définissons une constante pour illustrer le problème.
// Nous créons une constante appelée fruit, qui vaut 'legume'.
define('fruit','legume');

// Notez la différence
print $arr['fruit'];  // pomme
print $arr[fruit];    // carotte

// La suite est correcte si cela se passe dans une chaîne.
// Les constantes ne sont pas remplacées par leur valeur dans une chaîne
print "Bonjour $arr[fruit]";      // Bonjour pomme

// A une exception, les accolades entourant un tableau dans une chaîne
// permettent d'utiliser les constantes
print "Bonjour {$arr[fruit]}";    // Bonjour carotte
print "Bonjour {$arr['fruit']}";  // Bonjour pomme

// Ceci ne fonctionnera pas et donnera une erreur d'analyse
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Cela s'applique aussi aux autoglobales dans les chaînes
print "Bonjour $arr['fruit']";
print
"Bonjour $_GET['foo']";

// La concaténation est une alternative
print "Bonjour " . $arr['fruit']; // Bonjour pomme
?>

Lorsque vous activez l' error_reporting pour afficher les erreurs de niveau E_NOTICE (en utilisant le niveau E_ALL ) alors, vous verrez ces erreurs. Par défaut, error_reporting est trop faible pour les afficher.

Comme indiqué dans la section syntaxe , il doit y avoir une expression entre les crochets (' [ ' et ' ] '). Cela signifie que vous pouvez écrire ceci :
Utilisation d'une expression dans un index de tableau

<?php
echo $arr[somefunc($bar)];
?>
Ceci est un exemple d'utilisation de retour de fonction comme index de tableau. PHP reconnaît aussi les constantes, comme la famille des E_* .
Utilisation d'une constante dans un index de tableau

<?php
$error_descriptions
[E_ERROR]   = 'Une erreur fatale est survenue';
$error_descriptions[E_WARNING] = 'PHP émet une alerte';
$error_descriptions[E_NOTICE]  = 'Ceci est juste une alerte informelle';
?>
Notez que E_ERROR est aussi un identifiant valide, tout comme bar dans le premier exemple. Mais le dernier exemple est identique à ceci :
Utilisation d'une constante dans un index de tableau(2)

<?php
$error_descriptions
[1] = 'Une erreur fatale est survenue';
$error_descriptions[2] = 'PHP émet une alerte';
$error_descriptions[8] = 'Ceci est juste une alerte informationnelle';
?>
car E_ERROR vaut 1 , etc.

Comme nous l'avons déjà expliqué dans les exemples ci-dessus, $foo[bar] fonctionne mais est dangereux. Cela fonctionne car bar est identifié comme une constante. Mais si la constante n'existe pas, PHP suppose que vous souhaitez utiliser bar littéralement, sous la forme "bar" , mais que vous avez oublié les guillemets.

Pourquoi est-ce aussi dangereux?

A l'avenir, le groupe PHP peut décider d'ajouter une constante ou un autre mot clé, ou bien vous souhaiterez aussi ajouter une constante dans votre application et vous serez bloqué. Par exemple, vous ne pouvez pas utiliser des mots comme empty et default de cette manière, car ils sont déjà réservés .

Note

Pour insister, à l'intérieur d'une chaîne de caractères ( chaîne de caractères ) à guillemets doubles, il est correct de ne pas utiliser les guillemets simples dans les index et donc "$foo[bar]" est valide. Voyez les exemples ci-dessus pour plus de détails sur la syntaxe des variables dans les chaînes .

<< Pourquoi est-ce que $foo[bar] est invalide ? >>
Les tableaux A faire et à ne pas faire avec les tableaux Les tableaux