PHP | Аргументы функции переменной длинны

169
30 июля 2018, 12:30

Как правильно объявить функцию с одним параметром, принимающую массив одинакового типа элементов?

Первый вариант

Использование единственного аргумента типа array.

/**
 * @param string[] $dependencies
 */
public function setDependencies (array $dependencies) : void
{
    $this->dependencies = $dependencies;
}

Второй вариант

Использование аргументов функции переменной длинны.

/**
 * @param string ...$dependencies
 */
public function setDependencies (string ...$dependencies) : void
{
    $this->dependencies = $dependencies;
}
Answer 1

setDependencies(array $dependencies) - в данном случае вы, передаете 1 аргумент с типом array, где использоваться будет так:

setDependencies([1,2,3]);

А вот в случае с setDependencies (string ...$dependencies), вы задействуете оператор and so on (и так далее...) и сможете передавать неограниченное количество аргументов типа string и только:

setDependencies('str1', 'str2', 'str3'); 

Что собственно тоже является массивом.
Если внутри функции, сделать так:

var_dump($dependencies);

То вывод будет такой:

array(3) {
  [0]=>
  string(4) "str1"
  [1]=>
  string(4) "str2"
  [2]=>
  string(4) "str3"
}

Также можно передавать неограниченное количество массивов, если тип будет array, то есть так: setDependencies(array ...$dependencies), в данном случае мы, сможем передавать только массивы и ничего более (ну, а в массив, можно поместить, что угодно):

setDependencies(['str1', 1], ['str2', 2], ['str3', 3]);

И вывод уже будет такой:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(4) "str1"
    [1]=>
    int(1)
  }
  [1]=>
  array(2) {
    [0]=>
    string(4) "str2"
    [1]=>
    int(2)
  }
  [2]=>
  array(2) {
    [0]=>
    string(4) "str3"
    [1]=>
    int(3)
  }
}

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

READ ALSO
преобразование и отображение char в с++

преобразование и отображение char в с++

есть проблема, ввожу русские буквы, например "у", по идее оно должно отображать в формате char "у" , а в формате int номер по таблице ASCII "227", но оно...

155
byte*** array to object

byte*** array to object

У меня имеется 3 мерный динамический массив ImgAR типа byte***, в нем хранятся данные картинки разбитые по координатам пикселя и цветовым каналамИ...

174
C++ реализация стека

C++ реализация стека

Задача:Написать программу для моделирования Т-образного сортировочного узла на железной дороге с использованием контейнерного класса stackПрограмма...

225