Присваивание с конкатенацией: оператор .= в языке PHP
Оператор присваивания с конкатенацией в PHP
Наиболее эффективным способом добавления строки к уже существующей переменной является оператор .= (точка равно). Он объединяет оператор присваивания и конкатенации, считывая текущее значение переменной, присоединяя к нему новую строку и тут же сохраняя результат обратно в ту же переменную. Это избавляет от необходимости явно указывать переменную дважды.
Пример использования:
$greeting = 'Привет';
$greeting .= ', мир!';
echo $greeting; // Выведет 'Привет, мир!'точка равно в php (оператор присваивания с конкатенацией в php)
На каждом шаге .= уменьшает количество операций присваивания и делает код более компактным и читаемым. Он используется в циклах при формировании длинных строк, в шаблонизаторах и при построении SQL-запросов.
Типичная ошибка:
Забыть поставить точку перед равно (написать = вместо .=) - тогда переменная будет перезаписана, а не дополнена. Решение: всегда использовать .= при накоплении строки.
Как добавить строку к переменной с помощью конкатенации и последующего присваивания?
Классический способ: $var = $var . 'новая часть';. Он полностью эквивалентен оператору .=, но требует повторного упоминания переменной. Подходит, если нужно не только присвоить, но и использовать промежуточное значение.
$name = 'Код';
$name = $name . ' PHP';
echo $name; // 'Код PHP'
Проблема:
При большом количестве операций такой код становится громоздким и может скрыть логику. Решение: применять .= для краткости.
Цель: явное разделение конкатенации и присваивания для большей наглядности в простых сценариях.
Как накопить строку из элементов массива с использованием присваивания и конкатенации?
Если нужно собрать строку из частей, хранящихся в массиве, удобно применить цикл с оператором .= или функцию implode(). Второй вариант предпочтительнее по производительности и читаемости.
$parts = ['PHP', ' это', ' просто'];
$result = '';
foreach ($parts as $part) {
$result .= $part;
}
echo $result; // 'PHP это просто'
// Альтернатива без цикла:
$result2 = implode('', $parts);
echo $result2; // 'PHP это просто'
Ошибка:
Забыть инициализировать переменную $result пустой строкой - тогда при первой конкатенации может возникнуть предупреждение о неопределённой переменной. Решение: всегда присваивать начальное значение.
Для больших массивов цикл с .= менее эффективен, чем implode(), так как каждая итерация пересоздаёт строку.
Цель: сборка строки из коллекции элементов, когда порядок и содержание динамичны.
Как вставить переменные в строку с одновременным присваиванием результата?
Оператор .= можно комбинировать с синтаксисом интерполяции или с sprintf. Это позволяет добавлять форматированные фрагменты.
$user = 'admin';
$log = '';
$log .= "Пользователь: $user";
$log .= sprintf(" (уровень: %d)", 1);
echo $log; // 'Пользователь: admin (уровень: 1)'
Ошибка:
Использование одинарных кавычек для подстановки переменных - они не интерполируются. Решение: использовать двойные кавычки или sprintf.
Цель: динамическое формирование строк с подстановкой значений, когда части создаются по мере выполнения кода.
Расширенные примеры с оператором .
Пример 1. Построение многострочного текста в цикле
$items = ['Яблоко', 'Груша', 'Слива'];
$list = '';
foreach ($items as $item) {
$list .= "- $item\n";
}
echo $list;
- Яблоко - Груша - Слива
Пояснение: на каждой итерации к строке добавляется новая строка с элементом и символом новой строки. Начальное значение - пустая строка для предотвращения ошибки.
Пример 2. Использование . = с heredoc для формирования HTML-шаблона
$title = 'Страница';
$body = 'Содержимое';
$html = '';
$html .= <<
<!DOCTYPE html> <html> <head><title>Страница</title></head> <body><p>Содержимое</p></body> </html>
Пояснение: heredoc позволяет сохранить форматирование и интерполировать переменные. Оператор . = присоединяет результат heredoc к переменной. Важно: heredoc не должен содержать пробелов после закрывающего идентификатора.
Пример 3. Конкатенация с преобразованием типов
$count = 5;
$message = 'Всего: ';
$message .= $count; // автоматически преобразуется в строку
echo $message; // 'Всего: 5'
$price = 19.99;
$message2 = 'Цена: ';
$message2 .= $price;
echo $message2; // 'Цена: 19.99'
Всего: 5 Цена: 19.99
Пояснение: PHP автоматически приводит числа к строкам при конкатенации. Если же нужно явно контролировать формат, лучше использовать sprintf или number_format.
Пример 4. Накопление SQL-запроса с условиями
$query = 'SELECT * FROM users WHERE 1=1';
if (!empty($name)) {
$query .= " AND name = '$name'";
}
if (!empty($age)) {
$query .= " AND age = $age";
}
echo $query;
SELECT * FROM users WHERE 1=1 AND name = 'Анна' AND age = 25
Пояснение: оператор . = удобен для динамического построения запросов. Важна осторожность с SQL-инъекциями - в реальных проектах нужно использовать подготовленные выражения.
Пример 5. Комбинирование . = с тернарным оператором
$status = 'активен';
$output = 'Пользователь: ';
$output .= ($status === 'активен') ? 'онлайн' : 'офлайн';
echo $output; // 'Пользователь: онлайн'
Пользователь: онлайн
Пояснение: выражение справа от . = может быть любым, результат которого приводится к строке.
Пример 6. Использование . = для построения JSON-строки (без json_encode)
$data = ['key' => 'value', 'num' => 42];
$json = '{';
foreach ($data as $k => $v) {
$json .= "\"$k\":\"$v\",";
}
$json = rtrim($json, ',') . '}';
echo $json; // {"key":"value","num":"42"}
{"key":"value","num":"42"}
Пояснение: демонстрация ручного построения, хотя на практике следует использовать json_encode. Здесь . = добавляет каждую пару, затем удаляется лишняя запятая.