PHP 中的 Splat 运算符
PHPsplat运算符(...)从5.6版开始在PHP中可用。当它被介绍时,我记下了它,但从未真正使用过它,所以我认为稍微探索一下它可能会很有趣。
PHP中的省略号运算符在内部称为T_ELLIPSIS,尽管我过去听说过该运算符的几个不同名称。这包括以下名称:
省略
开箱运算符。
包装运算符。
三点运算符
展开运算符
运算符
就我个人而言,我认为splat是这个运算符的正确名称,所以从现在开始我将使用它。
正如某些名称所暗示的那样,splat运算符可用于将参数解包到函数或将变量组合到数组中。如果你在JavaScript中见过这个运算符,那么它通常被称为扩展运算符,它的工作方式非常相似。让我们通过一些示例来了解它在PHP领域的工作方式。
以下面的函数为例,它接受两个参数并将它们相加,返回输出。
function addNumbers($number1, $number2) { return $number1 + $number2; }
现在,采用以下数字数组。
$numbersArray=[1,2];
要使用上述函数将这些数字加在一起,我们可以以各种不同的方式调用该函数。splat运算符允许我们将数组发送到函数,它将被解压缩为单独的变量。
我们可以像这样使用splat运算符调用该函数。
echoaddNumbers(...$numbersArray);
这将打印出“3”。数组中的两个数字作为单独的参数发送给函数,函数将它们相加。
也可以使用splat运算符来创建具有可变数量参数的函数。通过将运算符添加到函数声明中,我们实质上是说该函数可以接收可变数量的输入,因此应相应地设置该函数以处理多个项目。
以下函数将取不同数量的数字并将它们相加。
function addNumbers(...$numbers) { $sum = 0; foreach ($numbers as $number) { $sum += $number; } return $sum; }
这通过以下方式调用。
echoaddNumbers(1,2,3,4,5);
此代码的输出为“15”,因为每个参数都作为数组发送到函数,并且所有数字都加在一起。我们可以根据需要向该函数添加任意数量的参数,一旦在函数内部,它们将变成单个数组。
也可以使用类型提示来确保我们只接收一组相同类型的项目。
以这个非常简单的类为例,它有一个我们通过构造函数设置的属性。
class Thing { public $value; public function __construct($value) { $this->value = $value; } }
我们可以通过在splat运算符前面使用类型提示来确保我们的函数只能接受一个或多个Thing对象,如下所示。
function addThings(Thing ...$things) { $sum = 0; foreach ($things as $thing) { $sum += $thing->value; } return $sum; }
有了这个,我们可以通过以下方式使用该功能。
$thing1 = new Thing(1); $thing2 = new Thing(2); echo addThings($thing1, $thing2);
如果我们将任何其他类型的变量传递给函数,它将抛出异常。
最后,从PHP7.4开始,还可以使用splat运算符运行一种数组合并操作。下面的示例创建一个数组,然后将其合并到第二个数组的开头。
$numbers1 = [1, 2, 3]; $numbers2 = [...$numbers1, 4, 5, 6]; print_r($numbers2);
这将打印出以下内容。
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )
我试图思考为什么我在我的专业PHP工作中并没有真正看到这个操作符,这可能是因为它在Drupal中使用不多。在本地搜索源代码后,我发现它在Deployer等应用程序中使用,其中可能将可变数量的主机名传递给函数。splat运算符用于将这些主机名打包到单个数组中。我可以看到它在JavaScript世界中被大量使用。事实上,splat运算符的数组合并使用在JavaScript中已经发生了,所以我可以理解为什么要添加它。