Интерполяция (двойная кавычка) ассоциативных массивов в 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-кодом . Любые объяснения? Можно ли доверять этой функции?


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

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

Да, вы можете доверять этому. Все способы интерполяции переменной подробно описаны в документации .

Если вы хотите иметь причину, почему это было сделано, ну, я не могу вам помочь. Но, как всегда: 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) и, следовательно, явный контроль над областью и объектом переменной применяется к строке

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

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