Ссылка сообщает об ошибке 404

нтерполяции элементов массива 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?)

Inerestingly,последняя строка кажется правильным кодом PHP, Есть объяснения? Можно ли доверять этой функции?

Редактировать: точка публикации теперь установлена ​​всмелое лицо чтобы уменьшить недопонимание.

 dreftymac27 июл. 2018 г., 23:44
Смотрите также: stackoverflow.com/questions/27742321/...

Ответы на вопрос(4)

это хорошо определенное поведение, и он всегда будет искать ключ строки'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 очень очень прощающий ... так что несоответствия предостаточно

И я должен сказать, что мне нравится интерполяция 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
 fpierrat29 сент. 2015 г., 12:48
Ссылка сообщает об ошибке 404
Решение Вопроса

Все способы интерполяции переменной освещены в документации очень хорошо.

Если вы хотите узнать причину, по которой это было сделано, я не могу вам помочь. Но, как всегда: PHP старый и сильно развился, что вводит противоречивый синтаксис.

 rubber boots19 янв. 2011 г., 19:40
@ Nikic как-то служить, верно. Но не на одной строке. сравните Perl: $ x = qq {<a href="$link"> $ text </a>};
 NikiC19 янв. 2011 г., 19:12
@mario: Лично я думаю, что это нехорошо, но многие, вероятно, в порядке с этим -> Отбросил эту часть.
 rubber boots19 янв. 2011 г., 19:11
@nikic, я не могу найти этот точный случай (без фигурных скобок) в документах, где это? Спасибо rbo
 NikiC19 янв. 2011 г., 19:13
@rubber boots: обратите внимание на эту строку:echo "He drank some $juices[koolaid1] juice.".PHP_EOL;.
 rubber boots19 янв. 2011 г., 19:20
@mario, я родом из Perl (все еще живу там) и интерполяциив Perl обычно делает вещи более читабельными. DMF в PHP здесь (особая черта) - это серия Perls q-operator (quote) -> qq {}, q {}, qx {}, qw {}. Поэтому (imho) интерполяция строк может быть не так полезна в PHP, как могла бы быть. :-(

который обрабатывается токенайзером PHP. Он не ищет, была ли определена какая-либо константа с таким именем, он всегда предполагает строковый литерал для совместимости с PHP3 и PHP4.

 NikiC19 янв. 2011 г., 19:18
Просто для тех, кто заинтересован (вероятно, никто ...): PHP будет генерироватьT_STRING для индекса массива (илиT_NUM_STRING если это не переполняемое десятичное число) вместо нормальногоT_CONSTANT_ENCAPSED_STRING.

Ваш ответ на вопрос