Подтвердить что ты не робот

Форматирование значения массива внутри 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;
4b9b3361

Ответ 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>

Таким образом, этот вид побеждает цель Герредоса в отношении терпения.


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

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

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