Форматирование значения массива внутри Heredoc

Мне было интересно, почему я не могу сделать что-то вроде {number_format($row['my_number'])} внутри Heredoc. Есть ли способ обойти это, не прибегая к определению переменной, такой как $myNumber ниже?

Посмотрел http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc, но ничего не нашел.

КОД

foreach ($dbh -> query($sql) as $row):
    $myNumber = number_format($row['my_number']);

    $table .= <<<EOT
          <tr>
          <td>{$row['my_number']}</td> // WORKS
          <td>$myNumber</td> // WORKS
          <td>{number_format($row['my_number'])}</td> // DOES NOT WORK!
          </tr>
EOT;
endforeach;

person Kamil Sindi    schedule 26.11.2011    source источник
comment
@KingCrunch, очевидно, да, ОП пытался. См. пример кода выше.   -  person Michael Berkowski    schedule 26.11.2011
comment
Не уверен, почему за это проголосовали. Это разумный вопрос, и ОП опубликовал пример, а также проконсультировался и связался с соответствующей языковой документацией.   -  person Michael Berkowski    schedule 26.11.2011
comment
@MichaelBerkowski Вы, должно быть, здесь новенький :)   -  person Breaking not so bad    schedule 26.03.2021
comment
@ e2-e4 Хм, в ноябре 2011 года я был.   -  person Michael Berkowski    schedule 26.03.2021
comment
@MichaelBerkowski и отличное чувство юмора!   -  person Breaking not so bad    schedule 30.03.2021


Ответы (1)


Вы можете выполнять функции в строке HEREDOC, используя {$ переменных выражений. Однако вам необходимо заранее определить переменную для имени функции:

$number_format = "number_format";

$table .= <<<EOT
      <tr>
      <td>{$row['my_number']}</td> // WORKS
      <td>$myNumber</td> // WORKS
      <td>{$number_format($row['my_number'])}</td> // DOES NOT WORK!
      </tr>

Таким образом, это противоречит цели краткости HEREDOC.


Для удобочитаемости может быть еще полезнее определить универсальное/недействительное имя функции, например $expr = "htmlentities"; для этой цели. Затем вы можете использовать практически любое сложное выражение и все глобальные функции в heredoc или двойных кавычках:

    "   <td>  {$expr(number_format($num + 7) . ':')}  </td>  "

И я думаю, что {$expr( просто более очевиден для любого, кто сталкивается с такой конструкцией. (В противном случае это просто странный обходной путь.)

person mario    schedule 26.11.2011