Конкатенация строк в PHP

Собрать сообщение, сформировать запрос, вывести HTML — без конкатенации строк в 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().


Дополнительные материалы

Предыдущая Статья

PHP 8.4: что нового и дата выхода

Следующая Статья

Как скрыть полосу прокрутки (скроллбар) с помощью CSS