Интерполяция (строка в двойных кавычках) ассоциативных массивов в 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
Другие вопросы по тегам