В чем разница между будущим оператором распространения 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: оператор распространения в выражении массива

Скоро в 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'],
);
Другие вопросы по тегам