1

compact()即将到来的 PHP8 的扩展运算符和它的预先存在的函数有什么区别?

$data = new CustomerData(...$input);

4

1 回答 1

0

紧凑和扩展运算符之间的区别

紧凑的 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 从 5.6 开始就已经支持参数解包(AKA 扩展运算符)。该 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'],
);
于 2020-07-24T12:02:31.477 回答