Конкатенация строк в PHP
., .=, интерполяцию, implode() или str_replace()? В статье — практические сценарии и таблица для быстрого выбора.Введение
В PHP строки объединяют пятью способами: оператором ., через .=, интерполяцией, implode() и заменой в шаблоне.
Какой выбрать? Зависит от задачи. Вот краткая шпаргалка:
| Если нужно... | Используйте... |
|---|---|
| Объединить 2-3 переменные | Оператор . |
| Собрать строку в цикле | Оператор .= |
| Вставить пару переменных в текст | Двойные кавычки "$var" |
| Склеить массив в строку | implode() |
| Создать шаблон письма/уведомления | str_replace() или strtr() |
У каждого подхода своя логика, и выбирать их стоит не по принципу «какой знаю», а по тому, что удобнее и понятнее в конкретной ситуации. Иногда это вопрос читаемости, иногда — структуры данных, а в редких случаях — даже производительности.
В этой статье мы подробно разберём каждый из пяти способов, а в конце ещё раз вернёмся к таблице, чтобы закрепить выбор.
Оператор конкатенации .
Самый простой и очевидный способ объединить строки — оператор .. Он берёт левый и правый операнды и возвращает новую строку, не изменяя исходные.
$greeting = "Hello";
$name = "world";
$message = $greeting . " " . $name;
// Hello worldОператор удобен, когда нужно объединить два-три значения. Но если таких значений много, код быстро становится громоздким.
Когда использовать: для простого объединения двух-трёх строк, когда не требуется накопление и все части известны заранее.
Составной оператор присваивания .=
Если оператор . создаёт новую строку, то .= работает иначе — он добавляет правый операнд к левому и сразу сохраняет результат в левую переменную. По сути, это сокращённая форма записи $str = $str . $something.
$message = "Hello";
$message .= " ";
$message .= "world";
// Hello worldЭтот оператор особенно удобен, когда строка строится постепенно: например, в цикле или при последовательном добавлении фрагментов.
$items = ['яблоко', 'груша', 'слива'];
$list = '';
foreach ($items as $item) {
$list .= $item . ', ';
}
// яблоко, груша, слива,Когда использовать: для пошагового накопления строки, особенно в циклах, когда количество частей заранее неизвестно или они добавляются последовательно.
Интерполяция строк
Интерполяция позволяет встраивать переменные прямо в строку — без операторов и объединения. Но работает это только в строках, заключённых в двойные кавычки "..." или heredoc.
$name = "мир";
$message = "Привет, $name!";
// Привет, мир!В одинарных кавычках интерполяции нет — переменные останутся буквальным текстом.
$name = "мир";
$message = 'Привет, $name!';
// Привет, $name!С простыми переменными всё работает без лишних усилий. Для доступа к элементам массива или свойствам объекта потребуется фигурный синтаксис:
$user = ['name' => 'Анна'];
$message = "Пользователь: {$user['name']}";
$obj = new stdClass();
$obj->name = 'Анна';
$message = "Пользователь: {$obj->name}";Без фигурных скобок PHP может неправильно распознать, где заканчивается имя переменной.
Когда использовать: когда внутри строки немного переменных и важна читаемость. Интерполяция делает код чище, чем многократные объединения через ., но для сложных выражений (вызовов функций, вычислений) она не подходит — там лучше вернуться к оператору.
Функция implode() для работы с массивами
implode() работает иначе: она объединяет все элементы массива в одну строку, вставляя между ними указанный разделитель. Если разделитель не нужен, передаётся пустая строка.
$words = ["Привет", "мир"];
$message = implode(" ", $words);
// Привет мир
$letters = ["a", "b", "c"];
$combined = implode("", $letters);
// abcГлавное преимущество — один вызов вместо цикла с многократной конкатенацией. Это удобно, когда данные уже собраны в массив: результат парсинга, список значений из базы данных или набор фрагментов, которые нужно объединить.
Также стоит помнить, что implode() работает только со значениями массива, игнорируя ключи. А если в массиве есть объекты, они должны реализовывать метод __toString().
Когда использовать: когда строки для объединения уже находятся в массиве. Это самый чистый и эффективный способ превратить массив в строку.
str_replace() и её возможности
Этот подход отличается от всех предыдущих. Здесь мы не объединяем строки — мы создаём шаблон с заполнителями, а затем заменяем их нужными значениями.
$template = "Привет, {name}! Сегодня {day}.";
$placeholders = ["{name}", "{day}"];
$values = ["Анна", "пятница"];
$message = str_replace($placeholders, $values, $template);
// Привет, Анна! Сегодня пятница.Такой способ удобен, когда:
- заполнителей много (5–10 и больше);
- одни и те же шаблоны используются многократно с разными данными;
- нужно поддерживать несколько языков или версий текста.
Если такое поведение нежелательно, вместо str_replace() используют strtr(), которая заменяет все вхождения одновременно.
$pairs = ['A' => 'B', 'B' => 'C', 'C' => 'D'];
echo strtr('A', $pairs); // BКуда идти дальше: описанный подход — основа простой шаблонизации. В реальных проектах его часто заменяют на полноценные шаблонизаторы вроде Twig или Blade, но для многих задач (письма, уведомления, локализация) связки «шаблон + str_replace()» или «шаблон + strtr()» оказывается достаточно.
Когда использовать: для множественных подстановок, локализации, повторяющихся структур, где удобнее хранить текст отдельно от логики.
Часто задаваемые вопросы
В этом разделе собраны типичные вопросы, которые возникают при выборе способа конкатенации.
А sprintf() и str_repeat() — это тоже конкатенация?
Строго говоря, нет. sprintf() — форматирование строк с контролем типа и формата. str_repeat() — генерация повторяющейся строки. Обе функции внутренне выполняют конкатенацию, но решают более узкие задачи. Для 99% случаев достаточно пяти основных способов, рассмотренных в статье.
Что быстрее — оператор . или интерполяция?
Разница в производительности настолько мала, что в реальных проектах ею можно пренебречь. Интерполяция работает быстрее в простых случаях, но при активном смешивании переменных и текста разница нивелируется. Главный критерий — читаемость. Интерполяция делает код чище, когда переменных немного. Если же значение приходит из сложного выражения (вызов функции, вычисление), оператор . смотрится естественнее.
Почему нельзя всегда использовать implode()?
implode() хорош, когда данные уже лежат в массиве. Если же строки формируются динамически и их количество неизвестно, проще накапливать их через .= в цикле. Собирать всё в массив только ради вызова implode() — лишнее действие.
В чём разница между str_replace() и strtr()?
Главное различие — в порядке замен. str_replace() обрабатывает замены последовательно, слева направо, поэтому результат может быть цепным. strtr() заменяет все вхождения одновременно — это предсказуемее для множественных подстановок.
// str_replace: цепная замена
$subject = str_replace(['A', 'B'], ['B', 'C'], 'A'); // 'C'
// strtr: одновременная замена
$subject = strtr('A', ['A' => 'B', 'B' => 'C']); // 'B'Можно ли использовать интерполяцию с массивами и объектами?
Да, но с оговорками. Для простых переменных — $name. Для элементов массива или свойств объекта нужен фигурный синтаксис: {$arr['key']} или {$obj->property}. Без фигурных скобок PHP может неверно определить границы имени переменной.
Какой способ выбрать для очень больших строк (от 10 МБ)?
Если строка строится в цикле, многократное использование . или .= создаёт много промежуточных копий, что нагружает память. Эффективнее:
- собирать фрагменты в массив и затем вызывать
implode(); - или работать с буфером вывода через
ob_start().
Есть ли оператор для добавления строки в начало, как .= для добавления в конец?
Нет. Прямого оператора нет. Обычно используют $str = $prefix . $str. Если таких операций много, можно собирать фрагменты в массив, добавляя в начало через array_unshift(), а затем объединять через implode().
Заключение
Мы рассмотрели пять способов объединить строки в PHP. У каждого — своя логика и своя область применения. Универсального «лучшего» варианта нет: выбор зависит от того, с какими данными вы работаете и как строится итоговая строка.
Вот краткая таблица, которую мы видели в начале — теперь она может служить быстрой шпаргалкой:
| Способ | Когда использовать |
|---|---|
. | Простое объединение двух-трёх строк, когда все части известны заранее |
.= | Постепенное накопление строки, особенно в циклах |
"" / heredoc | Внутри строки немного переменных, важна читаемость |
implode() | Данные уже находятся в массиве |
str_replace() / strtr() | Множественные подстановки, локализация, хранение текста отдельно от логики |
Главное, на что стоит опираться при выборе:
- Структура данных. Отдельные переменные или массив?
- Логика построения. Линейное объединение, накопление или подстановка в шаблон?
- Читаемость. Код пишут для людей. Иногда интерполяция лучше длинной цепочки
., а иногда — наоборот.
Понимание сильных сторон каждого подхода позволит писать не просто работающий, а аккуратный и понятный код. А когда задача выходит за рамки простой конкатенации — вы будете знать, в какую сторону развиваться: от str_replace() к полноценным шаблонизаторам, от цикла с .= к implode().