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