PHP 中三个点 (...) 的含义是什么?

2022-08-30 06:23:00

当我在服务器上安装Magento 2时,我遇到了一个错误。经过调查代码后发现有三个点(),这是产生错误的。我包含了我在下面找到的代码:...

return new $type(...array_values($args));

这个运算符叫什么,它的目的是什么?


答案 1

这在PHP中字面上称为...运算符,但在其他语言中称为splat运算符。来自2014年LornaJane关于该功能的博客文章:

此功能允许您捕获函数的可变数量的参数,并根据需要与传入的“正常”参数相结合。通过示例最容易看到:

function concatenate($transform, ...$strings) {
  $string = '';
  foreach($strings as $piece) {
      $string .= $piece;
  }
  return($transform($string));    }

echo concatenate(“strtoupper”, “I'd”, “like ”, 4 + 2, “apples”);

(这将打印I'D LIKE 6 APPLES)

函数声明中的参数列表包含运算符,它基本上意味着“ ...其他所有内容都应进入”。您可以将 2 个或更多参数传递到此函数中,第二个和后续参数将添加到 $strings 中,随时可供使用。...$stringsarray


答案 2

省略号有两种用法 (...)PHP 令牌 — 将它们视为打包数组并解压缩数组。这两个目的都适用于函数参数。


定义函数时,如果需要为函数提供动态数量的变量(即,在代码中调用时不知道将向该函数提供多少个参数),请使用省略号 (...) 标记将提供给该函数的所有剩余参数捕获到功能块内可访问的数组中。省略号 (...) 捕获的动态参数数可以为零个或多个。

例如

// function definition
function sum (...$numbers) { // use ellipsis token when defining function
    $acc = 0;
    foreach ($numbers as $nn) {
        $acc += $nn;
    }
    return $acc;
}

// call the function
echo sum(1, 2, 3, 4); // provide any number of arguments

> 10

// and again...
echo sum(1, 2, 3, 4, 5);

> 15

// and again...
echo sum();

> 0

当在函数实例化中使用打包时,省略号 (...) 捕获所有剩余的参数,即,您仍然可以拥有任意数量的初始固定(位置)参数:

function sum ($first, $second, ...$remaining_numbers) {
    $acc = $first + $second;
    foreach ($remaining_numbers as $nn) {
        $acc += $nn;
    }
    return $acc;
}

// call the function
echo sum(1, 2); // provide at least two arguments

> 3

// and again...
echo sum(1, 2, 3, 4); // first two are assigned to fixed arguments, the rest get "packed"

> 10

解压

或者,在调用函数时,如果先前为该函数提供的参数已合并到数组中,请使用省略号 (...) 标记将该数组转换为提供给函数的单个参数,即每个数组元素都分配给函数定义中指定的相应函数参数变量。

例如:

function add ($aa, $bb, $cc) {
    return $aa + $bb + $cc;
}

$arr = [1, 2, 3];
echo add(...$arr); // use ellipsis token when calling function

> 6

$first = 1;
$arr = [2, 3];
echo add($first, ...$arr); // used with positional arguments

> 6

$first = 1;
$arr = [2, 3, 4, 5]; // array can be "oversized"
echo add($first, ...$arr); // remaining elements are ignored

> 6

当使用数组函数操作数组或变量时,解压缩特别有用。

例如,解压缩array_slice的结果:

function echoTwo ($one, $two) {
    echo "$one\n$two";
}

$steaks = array('ribeye', 'kc strip', 't-bone', 'sirloin', 'chuck');

// array_slice returns an array, but ellipsis unpacks it into function arguments
echoTwo(...array_slice($steaks, -2)); // return last two elements in array

> sirloin
> chuck

推荐