PHP: Функции

Упаковка аргументов

Сигнатура функции array_merge в документации определяется так:

array_merge ([ array $... ] ) : array

Она говорит нам о том, что в array_merge можно передать любое количество массивов:

<?php

array_merge([1]);
# Array
# (
#     [0] => 1
# )
array_merge([1], [1]);
# Array
# (
#     [0] => 1
#     [1] => 1
# )
array_merge([1], [1], [3, 4]);
# Array
# (
#     [0] => 1
#     [1] => 1
#     [2] => 3
#     [3] => 4
# )
array_merge([1], [1], [3, 4], []);
# Array
# (
#     [0] => 1
#     [1] => 1
#     [2] => 3
#     [3] => 4
# )

С точки зрения вызова - ничего необычного, просто разное число аргументов. А вот определение функции с переменным числом аргументов выглядит необычно и использует незнакомый для нас синтаксис:

<?php

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

echo sum(9, 4); // => 13
echo sum(-3, 0, 3, 1); // => 1

Три точки представляют собой Spread Operator. Основная сложность для понимания состоит в том, что Spread Operator выполняет различные действия в зависимости от того, где он применяется. В определении функции он выполняет "упаковку" параметров, а при вызове - наоборот, "распаковку". Про упаковку параметров будем говорить в этом уроке. В следующем же уроке рассмотрим Spread Operator в роли распаковщика.

Итак, назначение Spread Operator в определении функции состоит в том, чтобы собрать в массив все переданные аргументы. Если в функцию не передаётся ни одного аргумента, то массив будет пустым.

<?php

echo sum(); // => 0

Обратите внимание на то, что этому оператору не важен тип аргументов, они все станут элементами массива, даже если мы передаём на вход функции массивы.

<?php

function show(...$arguments)
{
    print_r($arguments);
}

show([]);
# Array
# (
#     [0] => Array
#         (
#         )
#
# )

show([1, 3], [], 3);
#  Array
# (
#     [0] => Array
#         (
#             [0] => 1
#             [1] => 3
#         )
#
#     [1] => Array
#         (
#         )
#
#     [2] => 3
# )

Теперь взглянем на сигнатуру array_merge ещё раз:

array array_merge ( array $array1 [, array $... ] )

Видно, что функция array_merge ждёт на вход как минимум один массив, опциональны только следующие. Такого поведения можно добиться следующим кодом:

<?php

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

echo sum();
// PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function sum(), 0 passed

echo sum(10); // => 10
echo sum(10, 4); // => 14
echo sum(8, 10, 4); // => 22

То же можно сделать и для двух аргументов:

<?php

function sum($a, $b, ...$numbers)
{
    # ...
}

Эту идею можно продолжать и дальше, делая обязательными то количество аргументов, которое требуется. Единственное ограничение: Spread Operator может быть использован только для последнего аргумента. То есть такой код синтаксически не верен:

<?php

function sum(...$numbers, $a)
{
    # ...
}

И такой тоже:

<?php

function sum($a, ...$numbers, $a)
{
    # ...
}

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».