В чем разница между будущим оператором распространения PHP8 и его уже существующей компактной функцией?
В чем разница между будущим оператором распространения PHP8 и уже существующей функцией compact()?
https://stitcher.io/blog/php-8-named-arguments$data = new CustomerData(...$input);
1 ответ
Различия между оператором Compact и Spread
Компактная функция PHP:
compact - создает массив, содержащий переменные и их значения
<?php
$city = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";
$location_vars = array("city", "state");
$result = compact("event", $location_vars);
print_r($result);
?>
Какой вывод:
Array
(
[event] => SIGGRAPH
[city] => San Francisco
[state] => CA
)
Распределение массива:
при распространении массива объединить два и более массива без добавления ключа к его значению (ассоциативный массив):
$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]
Также можно использовать распространение массива для заполнения аргументов вызова метода, предположим, что у вас есть этот конструктор для вашего класса:
class CustomerData
{
public function __construct(
public string $name,
public string $email,
public int $age,
) {}
}
И используйте распространение массива, чтобы создатьCustomerData
объект:
$input = [
'age' => 25,
'name' => 'Brent',
'email' => 'brent@stitcher.io',
];
$data = new CustomerData(...$input);
Что такое же поведение, как:
$input = [
'age' => 25,
'name' => 'Brent',
'email' => 'brent@stitcher.io',
];
$data = new CustomerData($input['age'], $input['name'], $input['email']);
PHP уже поддерживает распаковку аргументов (оператор распространения AKA), начиная с версии 5.6. Этот RFC предлагает включить эту функцию в выражение массива.
Также, начиная с PHP 7.4, реализован оператор распространения в выражении массива.
Источники:
PHP: оператор распространения в выражении массива
Скоро в PHP 8: именованные аргументы
От: PHP 8: именованные аргументы
Именованные аргументы позволяют передавать аргументы функции на основе имени параметра, а не позиции параметра. Это делает значение аргумента самодокументированным, делает аргументы независимыми от порядка и позволяет произвольно пропускать значения по умолчанию.
class CustomerData
{
public function __construct(
public string $name,
public string $email,
public int $age,
) {}
}
$data = new CustomerData(
name: $input['name'],
email: $input['email'],
age: $input['age'],
);