Интерполяция (двойная кавычка) ассоциативных массивов в 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-кодом. Любые объяснения?
Можно ли доверять этой функции?
Изменить: точка публикации теперь установлена в
жирным шрифтом, чтобы уменьшить недоразумения.
Ответы
Ответ 1
Да, вы можете доверять этому. Все способы интерполяции переменной подробно описаны в документации.
Если у вас есть причина, почему это было сделано, я не могу вам помочь. Но, как всегда: 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