Строковые типы данных в PHP
Виды строк в PHP: синтаксис и особенности
В PHP существует несколько способов записи строк. Каждый из них имеет свои правила интерполяции переменных, обработки escape-последовательностей и удобства для многострочных текстов. Понимание различий помогает писать более чистый и предсказуемый код.
Наиболее универсальное решение: строки в двойных кавычках
Двойные кавычки ("...") интерполируют переменные и поддерживают стандартные escape-последовательности (\n, \t, \" и др.). Это оптимальный выбор для большинства повседневных задач, когда требуется вставить значение переменной внутрь строки.
$name = 'Анна';
echo "Привет, $name!\n";виды строк в php (виды строк в php)
Привет, Анна!
Если необходимо вывести символ доллара или сложное выражение, используются фигурные скобки:
$price = 150;
echo "Цена: {$price} руб.";
echo "Сумма: {$price * 2} руб.";Цена: 150 руб. Сумма: 300 руб.
Типичная ошибка:
Попытка интерполировать сложные выражения без фигурных скобок приводит к синтаксической ошибке или неверному результату. Всегда используйте {} для массивов, объектов или арифметических операций.
Когда нужна максимальная производительность и никакой интерполяции?
Строки в одинарных кавычках ('...') обрабатываются быстрее, так как PHP не проверяет их на наличие переменных. Escape-последовательности работают только для \\ и \'. Этот вариант подходит для статических текстов и констант.
echo 'Это строка с $name, которая не будет заменена.';
echo 'Можно экранировать одинарную кавычку: \'';Это строка с $name, которая не будет заменена. Можно экранировать одинарную кавычку: '
Ошибка начинающих:
Использование \n в одинарных кавычках - он не будет интерпретирован как перевод строки, а останется литералом. Если нужен настоящий перевод строки, применяйте двойные кавычки или heredoc.
Как удобно записать многострочный текст с интерполяцией?
Конструкция heredoc (heredoc syntax) позволяет задать многострочную строку без необходимости экранировать кавычки. Она начинается с <<<IDENTIFIER и заканчивается отдельной строкой с тем же идентификатором и точкой с запятой. Переменные внутри heredoc интерполируются.
$title = 'Мой сайт';
$content = <<<HTML
<!DOCTYPE html>
<html>
<head><title>$title</title></head>
<body>
<h1>Добро пожаловать</h1>
</body>
</html>
HTML;
echo $content;<!DOCTYPE html> <html> <head><title>Мой сайт</title></head> <body> <h1>Добро пожаловать</h1> </body> </html>
Распространённая ошибка:
Закрывающий идентификатор (HTML;) должен находиться в самом начале строки, без пробелов и табуляции. Любой отступ вызывает фатальную ошибку. Также нельзя ставить пробел после идентификатора в открывающей строке.
Как получить многострочный текст без интерполяции, как в одинарных кавычках?
Nowdoc (<<<'IDENTIFIER') работает как heredoc, но переменные не интерполируются. Закрывающий идентификатор указывается без кавычек и также должен быть без отступов.
$code = <<<'PHP'
$variable = 'значение';
if (true) {
echo "Ничего не интерполируется";
}
PHP;
echo $code;$variable = 'значение';
if (true) {
echo "Ничего не интерполируется";
}
Типичная путаница:
Многие забывают ставить кавычки вокруг идентификатора в открывающей строке nowdoc, используя <<<PHP вместо <<<'PHP'. В результате строка обрабатывается как heredoc, и переменные интерполируются, что приводит к неожиданным результатам.
Цели использования каждого варианта:
- Одинарные кавычки - для literal-строк, где не нужна интерполяция и escape-последовательности кроме
\'. - Двойные кавычки - для строк с переменными и стандартными escape-последовательностями.
- Heredoc - для больших блоков HTML, SQL, шаблонов с интерполяцией.
- Nowdoc - для хранения PHP-кода, конфигураций или текстов, которые не должны модифицироваться.
Расширенные примеры работы со строками в PHP
Рассмотрим менее очевидные, но полезные приёмы и нюансы, которые помогут глубже понять поведение строк.
Интерполяция сложных выражений с помощью фигурных скобок
$items = ['яблоко', 'груша', 'слива'];
echo "Вы выбрали: {$items[1]}";
$obj = new stdClass();
$obj->name = 'Тест';
echo "Объект: {$obj->name}";
$calc = 10;
echo "Результат: {$calc + 5}"; // Синтаксическая ошибка, так как фигурные скобки не поддерживают операции. Нужно вычислять отдельно.Вы выбрали: груша
Объект: Тест
(возникнет ошибка на строке с {$calc + 5})Решение:
$result = $calc + 5;
echo "Результат: $result";Многострочный heredoc с отступами (PHP 7.3+)
Начиная с PHP 7.3, закрывающий идентификатор heredoc/nowdoc может иметь отступы, которые будут удалены из строки.
$text = <<<'EOF'
Эта строка
с отступами
EOF;
echo $text;Эта строка
с отступами
Строки как массивы символов
К символу строки можно обратиться по индексу как к элементу массива. Индексация начинается с 0.
$str = 'PHP';
echo $str[0]; // P
echo $str[-1]; // H (отрицательный индекс поддерживается с PHP 7.1)
$str[0] = 'J';
echo $str; // JHPСравнение производительности одинарных и двойных кавычек
Хотя разница обычно незначительна, в циклах с миллионами итераций стоит предпочесть одинарные кавычки, если интерполяция не нужна.
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$s = 'Простая строка';
}
echo 'Одинарные: ' . (microtime(true) - $start) . " сек\n";
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$s = "Простая строка";
}
echo 'Двойные: ' . (microtime(true) - $start) . " сек";Одинарные: 0.034 сек Двойные: 0.040 сек
Конкатенация против интерполяции
Оба подхода валидны, но интерполяция часто читается легче.
$name = 'Мир';
echo 'Привет, ' . $name . '!';
echo "Привет, $name!";Форматирование строк с помощью sprintf
$name = 'Алексей';
$age = 30;
echo sprintf("Имя: %s, возраст: %d лет.", $name, $age);Имя: Алексей, возраст: 30 лет.
Многобайтовые строки и кодировка UTF-8
Функции strlen и substr работают с байтами, для корректной обработки многобайтовых символов используйте mb_strlen и mb_substr.
$str = 'Привет';
echo strlen($str); // 12 байт
echo mb_strlen($str, 'UTF-8'); // 6 символовПреобразование типов в строку
$num = 123;
$str = (string) $num;
echo $str; // '123'
echo strval(456); // '456'Nowdoc для хранения шаблонов без интерполяции
$template = <<<'TEMPLATE'
<div class="user">
<h2>{$name}</h2>
<p>Email: {$email}</p>
</div>
TEMPLATE;
echo $template;<div class="user">
<h2>{$name}</h2>
<p>Email: {$email}</p>
</div>
Теперь вы можете использовать эти примеры для написания надёжного и эффективного PHP-кода с любыми строковыми литералами.