PHP: Почему «$ {obj-> prop}» является ошибкой разбора, а «$ obj-> prop» допустимо? - PullRequest
0 голосов
/ 12 февраля 2019

PHP 7.3.2

При синтаксическом анализе переменных внутри строк в двойных кавычках PHP есть одна ошибка синтаксического анализа, которую я нахожу странной:

echo "${obj->prop}"; // Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR)

// But this is legal:
echo "$obj->prop";

// And, for instance, all these are legal as well:
echo "${arr['key']}";
echo "${arr[0]}";
echo "${arr['0']}";

Почему интерпретатор имеет особые предубеждения против -> в пределах ${…}?

1 Ответ

0 голосов
/ 13 февраля 2019

Во-первых, подобные фигурные скобки не являются альтернативной формой синтаксиса синтаксического анализа сложных переменных.

"$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 "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...