Интерполяция (строка в двойных кавычках) ассоциативных массивов в 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. Есть объяснения? Можно ли доверять этой функции?
Редактировать: точка публикации теперь выделена жирным шрифтом, чтобы уменьшить недопонимание.
4 ответа
Да, вы можете доверять этому. Все способы интерполяции переменной довольно хорошо описаны в документации.
Если вы хотите узнать причину, по которой это было сделано, я не могу вам помочь. Но, как всегда: PHP старый и сильно эволюционировал, что вводит противоречивый синтаксис.
Да, это хорошо определенное поведение, и он всегда будет искать ключ строки 'key'
а не значение (потенциально неопределенное) константы 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']
синтаксис.
Последний случай представляет собой особый случай, обрабатываемый токенайзером PHP. Он не ищет, была ли определена какая-либо константа с таким именем, он всегда предполагает строковый литерал для совместимости с PHP3 и PHP4.
Чтобы ответить на ваш вопрос, да, да, это может, и так же, как взорваться и взорваться, php очень очень прощающий... так что несоответствия предостаточно
И я должен сказать, что мне нравится интерполяция PHP для базовых последовательных перфораций переменных в строки сразу и там,
Однако, если вы выполняете только интерполяцию строковых переменных, используя объекты одного массива, может быть проще написать шаблон, в который вы можете печатать определенные переменные объекта (как, скажем, в 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