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, ",", " ")выводит число в русском формате с разделителями.
Закрепите практикой
Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.