Почему встраивание функций внутри строк отличается от переменных - PullRequest
3 голосов
/ 03 июня 2011

Я задавал такой вопрос раньше, но этот вопрос отличается, это больше касается логики синтаксического анализа.

Мои предыдущие вопросы были о том, как встроить функцию в строку (в двойных кавычках)и я получил этот ответ:

$date = "date";
echo "This page is under construction<br/><br/>Current Date: {$date('l jS \of F Y')}";

И после этого я начал задаваться вопросом, почему этот ниже не работает, в то время как выше работает нормально:

echo "This page is under construction<br/><br/>Current Date: {date('l jS \of F Y')}";

Как этоЛогика, лежащая в основе процесса синтаксического анализа, даже если переменные работают довольно хорошо внутри строк.

Я прочитал, что после знака синтаксического анализа PHP $ он пытается найти подходящую переменную для анализа и запуска, а также для разделения переменнойназвание мы также используем фигурные скобки {}, и это также то, что я понимаю, честно.

Но почему такой синтаксис необходим при разработке механизма синтаксического анализа для функций, потому что поначалу он не имел никакого смысла для меня.

По сути, зачем мне это нужно?определить переменную, которая будет содержать строковое представление имени функции, например:

$date = "date";

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 03 июня 2011

Из документации :

Примечание:

Функции, вызовы методов, переменные статических классов и константы классов внутри {$} работают с PHP 5Однако доступ к значению будет интерпретирован как имя переменной в области, в которой определена строка.Использование одиночных фигурных скобок ({}) не сработает для доступа к возвращаемым значениям функций или методов, а также к значениям констант класса или статических переменных класса.

Однако здесь есть хак:

function _expression($x) { return $x; }
$e = '_expression';

echo "This page is under construction<br/><br/>Current Date: {$e(date('l jS \of F Y'))}";
2 голосов
/ 03 июня 2011

Причина проста.Синтаксис любого сложного синтаксического анализа в двойных кавычках: {$.Никакая другая последовательность байтов не вызовет такое поведение в PHP.Этот синтаксический токен известен как T_CURLY_OPEN.

. Вы можете использовать функции с ним только в качестве побочного продукта поддержки PHP выражений объектов и массивов сэто.

...