4.2.6.3 Attention aux tableaux
4.2.6 Les tableaux
4.2 Les types
4 Référence
Manuel PHP
->Pourquoi est ce que $foo[bar] est invalide?
|
4.2.6.3.1 Pourquoi est ce que $foo[bar] est invalide?
Dans vos vieux scripts, vous pouvez avoir utilisé la syntaxe suivante :
Accès aux index de tableaux, ancienne méthode |
<?php $foo[bar] = 'ennemi'; echo $foo[bar]; ?>
|
Cela est mauvais, mais ca 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. Actuellement,
cela fonctionne car la constante indéfinie est transformée en chaîne ayant la
même valeur.
D'autres exemples :
Exemples de conflits de constantes indéfinies |
<?php // Affichons toutes les erreurs error_reporting(E_ALL);
$arr = array('fruit' => 'pomme', 'légume' => 'carotte');
// Correct print $arr['fruit']; // pomme print $arr['légume']; // 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 'légume'. define('fruit','légume');
// 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 concatenation 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 informationnelle"; ?>
|
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 il sont déjà
réservés .
Note |
Pour insister, à l'intérieur d'une chaîne de caractères
(
string
) à guillemets doubles, il est correct de ne pas utiliser
les guillemets simples dans les index, et
"$foo[bar]"
est valide.
Voyez les exemples ci-dessus pour plus de détails sur la syntaxe des
variables dans les chaînes .
|
|