PHP: Есть ли разница между {$ foo} и ${foo}

Иногда вам нужно разъяснять PHP, что на самом деле является именем переменной. Я обнаружил, что мы с коллегой делали это несколько иначе. Предположим, что у вас есть переменная $foo и вы хотите вывести ее с добавлением _constant_string Я использовал

return "<input type='hidden' name='${foo}_constant_string' value='true' />";

тогда как мой коллега использует

return "<input type='hidden' name='{$foo}_constant_string' value='true' />";

(слегка надуманный пример, чтобы упростить его).

Мои быстрые тесты не показывают явной разницы, но мне любопытно: есть ли разница? Есть ли причина предпочесть друг другу?

Изменить: Мой пример выше использовал строки, но мой вопрос был более общим - я должен был прямо сказать это. Я знал, что вы можете использовать фигурные скобки для ускользания, но не нашли конкретной точки, если бы были (в любых ситуациях) различия между двумя способами их использования. Я получил ответ: для строк не существует (что такое "дублирующее" сообщение), но для массивов и объектов (спасибо @dragoste).

Ответ 1

Кажется, нет никакой разницы в какой-либо версии PHP

    $foo = 'test';      
    var_dump("$foo");
    var_dump("{$foo}");
    var_dump("${foo}");

Тест: https://3v4l.org/vMO2D

В любом случае, я предпочитаю "{$foo}", так как я считаю его более читаемым и работает во многих других случаях, когда другого синтаксиса нет.

В качестве примера попробуйте использовать свойство объекта:

var_dump("$foo->bar"); //syntax error
var_dump("{$foo->bar}"); // works great
var_dump("${foo->bar}"); //syntax error

В том же случае используются массивы.

http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.complex

Ответ 2

Нет, нет разницы.

// Works, outputs: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

Руководство Php

fooobar.com/questions/60289/...

Другой способ использовать его для переменной:

$foo = 'test';
$test = 'foo';
var_dump("{${$foo}}"); //string(3) "test"

Или для массива:

$foo = ['foo','test'];
var_dump("{$foo[0]}"); //string(3) "foo"
var_dump("${foo[1]}"); //string(3) "test"

Ответ 3

Нет никакой разницы между следующим утверждением -

echo "This is {$great}";
echo "This is ${great}";

Вывод обоих операторов будет таким же. Пожалуйста, проверьте следующий пример -

$great = 'answer';
echo "This is {$great}"."\n";
echo "This is ${great}";

Output:-

This is answer
This is answer