Heredoc, Nowdoc и форматирование строк в PHP

Heredoc и nowdoc в PHP: многострочные строки, интерполяция, sprintf для форматирования, printf и number_format.

Heredoc — синтаксис для многострочных строк с интерполяцией переменных. Nowdoc — то же самое, но без интерполяции. Оба незаменимы при генерации HTML, SQL-запросов и шаблонов.

Heredoc

Heredoc начинается с <<<МЕТКА и заканчивается МЕТКА; на отдельной строке. Переменные внутри раскрываются, как в двойных кавычках:

<?php
$name = "Анна";
$role = "администратор";
$email = "[email protected]";

$message = <<<TEXT
    Уважаемый(ая) $name,

    Ваш аккаунт активирован.
    Роль: $role
    Email: $email

    С уважением, команда CodeChick
    TEXT;

echo $message;

Вывод:

    Уважаемый(ая) Анна,

    Ваш аккаунт активирован.
    Роль: администратор
    Email: [email protected]

    С уважением, команда CodeChick

С PHP 7.3 закрывающая метка может иметь отступ — лишние пробелы автоматически обрезаются.

Nowdoc — строка без интерполяции

Nowdoc работает как одинарные кавычки: переменные не раскрываются. Открывающая метка берётся в одинарные кавычки:

<?php
$code = <<<'PHP'
    <?php
    $name = "Мир";
    echo "Привет, $name!";
    PHP;

echo $code;

Вывод:

    <?php
    $name = "Мир";
    echo "Привет, $name!";

Nowdoc удобен, когда нужно вывести PHP-код как текст — переменные внутри не трогаются.

sprintf — форматирование строк

sprintf() возвращает отформатированную строку по шаблону. printf() сразу выводит её:

<?php
$item = "кофе";
$price = 149.9;
$quantity = 3;

$line = sprintf("%-15s %6.2f руб.  x%d", $item, $price, $quantity);
echo $line;
// Вывод: кофе             149.90 руб.  x3

$total = $price * $quantity;
printf("Итого: %.2f руб.\n", $total);
// Вывод: Итого: 449.70 руб.

Основные спецификаторы форматирования:

СпецификаторЧто вставляет
%sстрока
%dцелое число
%fдробное число
%.2fдробное с 2 знаками после точки
%05dцелое с нулями слева (5 символов)
%-10sстрока, выравнивание влево, ширина 10

number_format — человекочитаемые числа

Для вывода чисел в удобном для чтения виде (например, цены) используют number_format():

<?php
$amount = 1234567.891;

echo number_format($amount);              // Вывод: 1,234,568
echo number_format($amount, 2);           // Вывод: 1,234,567.89
echo number_format($amount, 2, ",", " "); // Вывод: 1 234 567,89 (русский формат)

Вывод:

1,234,568
1,234,567.89
1 234 567,89

Практический пример: генерация HTML

<?php
function renderCard(string $title, string $text, string $url): string {
    return <<<HTML
        <div class="card">
            <h2>$title</h2>
            <p>$text</p>
            <a href="$url">Подробнее</a>
        </div>
        HTML;
}

echo renderCard(
    title: "PHP 8.3",
    text:  "Вышла новая версия PHP с типизированными константами классов.",
    url:   "https://www.php.net/releases/8.3/",
);

Вывод:

        <div class="card">
            <h2>PHP 8.3</h2>
            <p>Вышла новая версия PHP с типизированными константами классов.</p>
            <a href="https://www.php.net/releases/8.3/">Подробнее</a>
        </div>

Коротко

  • Heredoc <<<TEXT...TEXT — многострочная строка с интерполяцией, как двойные кавычки.
  • Nowdoc <<<'TEXT'...TEXT — многострочная строка без интерполяции, как одинарные кавычки.
  • sprintf() возвращает строку по шаблону; printf() сразу выводит.
  • number_format($n, 2, ",", " ") выводит число в русском формате с разделителями.
Проверьте себя
1. Чем nowdoc отличается от heredoc?
ANowdoc использует двойные кавычки вокруг метки и раскрывает переменные
BNowdoc использует одинарные кавычки вокруг метки и НЕ раскрывает переменные
CNowdoc предназначен только для SQL-запросов
DNowdoc работает быстрее heredoc
2. Что вернёт sprintf("Товар: %s, цена: %.2f руб.", "кофе", 49.9)?
AТовар: %s, цена: %.2f руб.
BТовар: кофе, цена: 49.90 руб.
CТовар: кофе, цена: 49.9 руб.
DОшибку — неверное число аргументов
3. Как вывести число 1234567.5 в формате "1 234 567,50" (русский формат)?
Aprintf("%.2f", 1234567.5)
Bnumber_format(1234567.5, 2, ",", " ")
Csprintf("%d", 1234567.5)
Dround(1234567.5, 2)

Закрепите практикой

Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.

Поддержать проект