“…”省略号运算符在 PHP 中的多种用法
随着 PHP 发展到现代版本,一个在不同地方被彻底使用的操作符是(…)操作符。
在本文中,我将讨论这个运算符在 PHP 中的各种用例。
变参函数及方法
变参函数是接受可变数量参数的函数。这里的省略号运算符可以用来定义 PHP 中的可变函数。
省略号运算符在此上下文中也称为 “rest” 运算符。
例如,下面是一个变参函数。
function sum(...$numbers)
{
return array_sum($numbers);
}
echo sum(1, 2, 3, 4, 5); // 15
sum
函数接受可变数量的参数,并返回所有参数的总和,因为 $numbers
参数是传递给该函数的所有参数的数组。
类似地,变参方法是接受可变数量参数的方法。这里可以使用省略号运算符来定义 PHP 中的可变方法。
例如,以下是一种变参方法。
class Calculator
{
public function sum(...$numbers)
{
return array_sum($numbers);
}
}
$calculator = new Calculator;
echo $calculator->sum(1, 2, 3, 4, 5); // 15
数组解包
数组解包是一种使用省略号运算符将值数组作为参数传递给函数或方法的方式。
在此上下文中,省略号运算符也称为“spread”运算符。
例如,以下函数接受三个参数。
function sum($a, $b, $c)
{
return $a + $b + $c;
}
因此,如果你想将一个值数组传递给这个函数,可以使用省略号运算符来完成。
$numbers = [1, 2, 3, 4, 5];
echo sum(...$numbers); // 6
如你所见,sum
函数接受 3 个参数。但我们传递一个 5 个值的数组给他。因此,这种情况下,数组的前 3 个值作为参数传递给函数,而其他的值被忽视。
Variadic 数组合并
可变(Variadic)数组合并是一种将多个数组合并为单个数组的方法。省略号运算符可用于使用数组拆包将多个数组合并为单个数组。
例如,以下代码将两个数组合并为一个数组。
$numbers = [1, 2, 3];
$alphabets = ['a', 'b', 'c'];
$merged = [...$numbers, ...$alphabets];
var_dump($merged);
// [1, 2, 3, 'a', 'b', 'c']
自 PHP 8.1 起,你也可以使用省略号操作符合并关联数组。
First-class callables
最后,从PHP8.1开始,省略号运算符可以用于将 callable 作为闭包传递给函数,通过所谓的 “first-class cllable” 实现。
这里有一个例子。
function cube($n)
{
return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map(cube(...), $a);
print_r($b);
// [ 1, 8, 27, 64, 125 ]
array_map
使用 cube
函数作为回调,以映射 $a
数组。这里的技巧是,我们使用省略号运算符将 cuabe
函数作为 callable 传递。
这意味着 callable 不会直接调用。相反,它将 callable 传递给 array_map
函数,然后在内部调用它。
这种语法的优点是,静态分析可以访问 cube
函数,并尊重 callable 创建时的作用域。最重要的是,它现在也对 IDE 友好,因为现在可以直接跳到支持的 IDE 中的函数!
没有省略号运算符的等效代码将是:
$b = array_map('cube', $a);
我们必须将 cube
函数作为字符串传递给 array_map
函数。这意味着这对 IDE 不友好,因为 IDE 不知道 cube
函数是在哪里定义的。