Использование статических переменных класса — в heredoc

#php #html

#php #HTML

Вопрос:

Я создал класс, упрощенный следующим образом:

 class Labels {
    static public $NAMELABEL = "Name";
}
  

Я успешно добился, чтобы следующий код работал нормально:

 echo '<table border="1">';
  echo '<tr>';
  echo "<th>" . Labels::$NAMELABEL . "</th>";
  echo '</tr>';

 // the rest of the Table code not shown for brevity...

echo "</table>";
  

Я вижу таблицу с заголовком столбца под названием Name, когда я запускаю это — так что все работает нормально.

Но не внутри heredoc — я получаю «Уведомление: Неопределенная переменная: NAMELABEL в C:xampp……..blah бла» когда я запускаю следующее:

     echo <<<_END
       <form action="index.php" method="post"><pre>
       Labels::$NAMELABEL : <input type="text" name="author" />
       <input type="submit" value="ADD RECORD" />
    </pre></form>
_END;
  

Я пробовал все виды кавычек, оператор объединения строк ‘.’, ничего не работает.
Я подумал: «Ну, я получил статические переменные класса для работы в HTML-таблице,
почему не в heredoc.»

Черт возьми, я люблю heredocs, у них странное название и странные проблемы. Это своего рода умопомрачительное развлечение, которого я жажду, heredocs — праведные маленькие обезьянки doosh.

Я действительно хочу использовать здесь свои статические переменные класса — есть ли какая-то комбинация цитирования / конкатенации строк, которая позволит мне встроить их в мои heredocs?

Комментарии:

1. Какую версию PHP вы используете, 5.3 или более раннюю версию?

2. Это давняя ошибка в анализаторе Heredoc (проблема области видимости). Я наткнулся на это сегодня, когда искал информацию о связанной ошибке синтаксического анализа статической переменной heredoc.

Ответ №1:

Интерполяция в heredocs работает так же, как в двойных кавычках, поэтому вы можете использовать фигурные скобки («сложный») синтаксис.

Однако анализатор не распознает статические переменные класса (см. предыдущую документацию). Чтобы ссылаться на статические переменные класса, вам нужно будет установить их локально следующим образом:

 $label = Labels::$NAMELABEL;

echo <<<_END
    <form action="index.php" method="post"><pre>
       $label : <input type="text" name="author" />
       <input type="submit" value="ADD RECORD" />
    </pre></form>
_END;
  

Комментарии:

1. @Jordan зачем нужен $, будет ли он работать без него. Некоторые из примеров в документе, на который вы ссылались, делают такие вещи, как {$foo->$bar} , и {${beers::softdrink}} . Так что {Labels::$NAMELABEL} , без $, тоже сработало бы?

2. Спасибо, это приблизило меня — однако, чтобы убрать предупреждение о «неправильном синтаксисе» в моем редакторе Netbeans, мне пришлось поставить пробел, подобный этому: ${ Labels:: $NAMELABEL} — который исправил синтаксическую ошибку в браузере. Теперь он вычисляется как Name, но браузер помечает его надписью Notice: Неопределенная переменная: Name в C:xampp………blah бла.

3. Я считаю, что должно быть $ либо непосредственно предшествующее, либо сразу следующее за открытием { . Поскольку Labels в вашем коде есть имя класса (no $ ), вы должны использовать ${ , чтобы интерпретатор знал, что делать.

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

5. Не работает — Netbeans правильно кодирует синтаксис цветом, но когда Labels::$NAMELABLE выдает название, это ошибка. Я пробовал одинарные кавычки, двойные кавычки, я пробовал $ внутри и снаружи фигурной скобки, пробовал вложенные фигурные скобки, почему-то я подозреваю, что этот синтаксис heredoc, возможно, не будет работать со статическими переменными класса. Я собираюсь высказать смелое предположение и подозреваю, что внутри <<< heredoc вы не можете использовать переменные, только html.