Форматирование значения массива внутри Heredoc - PullRequest
16 голосов
/ 26 ноября 2011

Мне было интересно, почему я не могу сделать что-то вроде {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;

1 Ответ

29 голосов
/ 26 ноября 2011

Вы можете выполнять функции в строке 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>

Так что этот вид победы над целью краткости HEREDOCs.


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

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

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

...