← Назад к вопросам

Как работает spread-оператор в PHP?

1.8 Middle🔥 91 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разбор оператора Spread (...) в PHP

Spread-оператор (...) появился в PHP 7.4 как мощный инструмент для работы с массивами (arrays) и Traversable объектами. Его основная задача — "распаковка" элементов коллекции в контексте, где ожидается набор отдельных значений.

Основные применения и синтаксис

1. Распаковка массивов в аргументы функции

Он позволяет передать элементы массива как отдельные аргументы функции, особенно удобно для функций, принимающих переменное число аргументов.

function sum(...$numbers) {
    return array_sum($numbers);
}

$values = [1, 2, 3, 4];
$result = sum(...$values); // Эквивалентно sum(1, 2, 3, 4)
echo $result; // Выводит 10

2. Распаковка в объявлении массива (Array Unpacking)

В PHP 7.4+ spread можно использовать внутри квадратных скобок [] для объединения массивов.

$array1 = [1, 2, 3];
$array2 = [4, 5, 6];
$merged = [...$array1, ...$array2]; // [1, 2, 3, 4, 5, 6]

// Можно комбинировать с обычными элементами
$combined = [0, ...$array1, 7, ...$array2, 8]; // [0, 1, 2, 3, 4, 5, 6, 7, 8]

3. Распаковка Traversable объектов

Spread работает с любыми объектами, реализующими интерфейс Traversable (например, Iterator, Generator).

$generator = function() {
    yield 'a';
    yield 'b';
    yield 'c';
};

$array = [...$generator()]; // ['a', 'b', 'c']

Ключевые особенности и ограничения

  • Порядок выполнения: Spread выполняется слева-направо. Это важно при объединении массивов с одинаковыми ключами.
$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['b' => 3, 'c' => 4];
$result = [...$arr1, ...$arr2]; // ['a' => 1, 'b' => 3, 'c' => 4]
// Значение 'b' из $arr2 переопределяет значение из $arr1
  • Только для массивов и Traversable: Нельзя распаковать скалярные значения (строки, числа) или объекты без интерфейса Traversable.

  • Аргументы функций: В аргументах функции spread можно использовать только один раз, и обычно в конце списка.

Практические примеры и сравнение

Без spread (старый способ):

$merged = array_merge($array1, $array2);

С spread (современный способ):

$merged = [...$array1, ...$array2];

Важное отличие: array_merge() обрабатывает строковые ключи, переопределяя значения при совпадении, но reset-ит числовые ключи. Spread-оператор, используемый в объявлении массива, ВСЕГДА создает массив с последовательными числовыми индексами, независимо от исходных ключей. Для сохранения строковых ключей нужно использовать другие методы.

Пример с генераторами и производительностью

Spread позволяет эффективно работать с генераторами без явного использования iterator_to_array():

function generateNumbers($limit) {
    for ($i = 0; $i < $limit; $i++) {
        yield $i;
    }
}

// Быстрое преобразование генератора в массив
$numbersArray = [...generateNumbers(5)]; // [0, 1, 2, 3, 4]

Заключение

Spread-оператор в PHP — это синтаксический сахар, который значительно улучшает читаемость и сокращает код при работе с коллекциями данных. Он стал стандартом для:

  • Объединения массивов без вызова функций
  • Передачи динамических аргументов в функции
  • Преобразования Traversable объектов в массивы

Однако важно помнить его ограничения: он не заменяет array_merge() для случаев со строковыми ключами и требует внимания к порядку выполнения при переопределении значений. В современных PHP проектах (8.0+) его использование считается best practice для операций с массивами и генераторами.

Как работает spread-оператор в PHP? | PrepBro