web-dev-qa-db-fra.com

Interpolation (chaîne entre guillemets doubles) des tableaux associatifs dans PHP

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é?


Éditer: Le point de l’affichage est maintenant défini en caractère gras afin de réduire les malentendus.

43
rubber boots

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.

45
NikiC

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.

10
mfonda

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.

9
mario

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
0
aqm