Интерполяция (двойная кавычка) ассоциативных массивов в PHP

При интерполяции элементов массива с строковыми индексами PHP (5.3.3, Win32) можно ожидать следующее поведение:

$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?)

Инертно, последняя строка кажется правильным PHP-кодом. Любые объяснения? Можно ли доверять этой функции?


Изменить: точка публикации теперь установлена ​​в жирным шрифтом, чтобы уменьшить недоразумения.

Ответ 2

Да, это хорошо определенное поведение и всегда будет искать строковый ключ 'key', а не значение константы (потенциально undefined) key.

Например, рассмотрим следующий код:

$arr = array('key' => 'val');
define('key', 'defined constant');
echo "\$arr[key] within string is: $arr[key]";

В результате вы получите следующее:

$arr[key] within string is: val

Тем не менее, это, вероятно, не самая лучшая практика для написания кода, подобного этому, и вместо этого использовать:

$string = "foo {$arr['key']}"

или

$string = 'foo ' . $arr['key']

синтаксис.

Ответ 3

Последний - это специальный случай, обрабатываемый токенизатором PHP. Он не ищет, если какая-либо константа по этому имени была определена, она всегда принимает строковый литерал для совместимости с PHP3 и PHP4.

Ответ 4

Чтобы ответить на ваш вопрос, да, да, он может и так же, как взорвать и взорваться, php очень очень прощает... так непоследовательность изобилует

И я должен сказать, что мне нравится PHP-интерполяция для базовых daisy-перфорирующих переменных в строки тогда и там,

Однако, если вы выполняете только строчную переменную-интерполяцию с использованием объектов одного массива, может быть проще написать шаблон, который можно развернуть, чтобы напечатать определенные переменные объекта (например, в javascript или python) и, следовательно, явный контроль над переменной область и объект, применяемые к строке

Я, хотя этот парень isprintf действительно полезен для такого рода вещей

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