Во-первых, подобные фигурные скобки не являются альтернативной формой синтаксиса синтаксического анализа сложных переменных.
"$var"
и "${var}"
- простой синтаксис, а "{$var}"
- сложный синтаксис.
В простом синтаксисе интерпретатор строго ищет имя переменной, а не выражение, ифигурные скобки используются только для обозначения конца имени, если у вас есть что-то вроде "${var}othertext"
.В руководстве говорится
Если встречается знак доллара ($), синтаксический анализатор с жадностью примет как можно больше токенов, чтобы сформировать правильное имя переменной.Заключите имя переменной в фигурные скобки, чтобы явно указать конец имени.
Интерпретатор не имеет предубеждений конкретно против ->
в ${…}
, фактически интерпретатор очень строг в отношении того, что он считаетдопустимое имя переменной в ${…}
и делает одно исключение для доступа к одному ключу массива.
Вы не можете, например, "${var['a']['b']}"
.
На первом этапе интерпретацииВ коде, когда строка токенизируется, ${
является токеном T_DOLLAR_OPEN_CURLY_BRACES
, который переводит сканер в состояние «ищет имя переменной».В этом состоянии единственной вещью, которая будет распознаваться как имя переменной, является допустимая метка, за которой следует открытая квадратная скобка или закрывающая фигурная скобка.
Пример токенизации ключа массива выглядит следующим образом:
source: " ${ arr [ 'key' ] } "
tokens: " T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME [ T_CONSTANT_ENCAPSED_STRING ] } "
И пример свойства объекта выглядит следующим образом:
source: " ${ obj -> prop } "
tokens: " T_DOLLAR_OPEN_CURLY_BRACES T_STRING T_OBJECT_OPERATOR T_STRING } "
Ошибка синтаксического анализа происходит на следующем шаге, где оператор объекта применяется к строке, где он является неожиданным.
Используя простой синтаксис без фигурных скобок, вы получаете вместо этого эти токены, которые, как вы знаете, прекрасно работают:
source: " $obj -> prop "
tokens: " T_VARIABLE T_OBJECT_OPERATOR T_STRING "