Lors de l'interpolation des éléments de tableau indexés par chaînes de PHP (5.3.3, Win32) , Le comportement suivant peut être attendu ou non:
$ha = array('key1' => 'Hello to me');
print $ha['key1']; # correct (usual way)
print $ha[key1]; # Warning, works (use of undefined constant)
print "He said {$ha['key1']}"; # correct (usual way)
print "He said {$ha[key1]}"; # Warning, works (use of undefined constant)
print "He said $ha['key1']"; # Error, unexpected T_ENCAPSED_AND_WHITESPACE
print "He said $ha[ key1 ]"; # Error, unexpected T_ENCAPSED_AND_WHITESPACE
print "He said $ha[key1]"; # !! correct (How Comes?)
Il est intéressant de noter que la dernière ligne semble correspondre au code PHP correct . Des explications? Peut-on faire confiance à cette fonctionnalité?
Oui, vous pouvez y faire confiance. Tous les moyens d'interpolation d'une variable sont traités dans la documentation plutôt bien.
Si vous voulez avoir une raison pour laquelle cela a été fait, eh bien, je ne peux pas vous aider là-bas. Mais comme toujours: PHP est ancien et a beaucoup évolué, introduisant ainsi une syntaxe incohérente.
Oui, ce comportement est bien défini et cherchera toujours la clé de chaîne 'key'
et non la valeur de la constante (potentiellement non définie) key
.
Par exemple, considérons le code suivant:
$arr = array('key' => 'val');
define('key', 'defined constant');
echo "\$arr[key] within string is: $arr[key]";
Cela produira les éléments suivants:
$arr[key] within string is: val
Cela dit, ce n’est probablement pas la meilleure pratique d’écrire du code comme celui-ci, mais d’utiliser plutôt:
$string = "foo {$arr['key']}"
ou
$string = 'foo ' . $arr['key']
syntaxe.
Le dernier est un cas particulier traité par le générateur de jetons PHP. Il ne recherche pas si une constante portant ce nom a été définie, mais suppose toujours un littéral de chaîne pour la compatibilité avec PHP3 et PHP4.
Pour répondre à votre question, oui, oui, et comme l’implosion et l’explosion, php est très tolérant ... les incohérences abondent
Et je dois dire que j'aime l'interpolation de PHP pour le poinçonnage de variables de base dans les chaînes alors et là,
Cependant, si vous n'effectuez qu'une interpolation de variable de chaîne à l'aide d'objets d'un seul tableau, il peut être plus facile d'écrire un modèle dans lequel vous pouvez daisy imprimer une variable d'objet spécifique (comme dans javascript ou python) et par conséquent un contrôle explicite sur la variable être appliqué à la chaîne
Je pense que l'isprintf de ce type est vraiment utile pour ce genre de chose
http://www.frenck.nl/2013/06/string-interpolation-in-php.html
<?php
$values = array(
'who' => 'me honey and me',
'where' => 'Underneath the mango tree',
'what' => 'moon',
);
echo isprintf('%(where)s, %(who)s can watch for the %(what)s', $values);
// Outputs: Underneath the mango tree, me honey and me can watch for the moon