当前位置: 首页 > 知识库问答 >
问题:

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

邵宜年
2023-03-14

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

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

共有3个答案

赫连子石
2023-03-14

每个答案都指同一篇博文,除此之外,这里是关于可变长度论点列表的官方留档:

http://php.net/manual/en/functions.arguments.php#functions.variable-参数列表

在PHP5.6及更高版本中,参数列表可能包括。。。表示函数接受可变数量的参数的标记。参数将作为数组传递给给定变量

似乎“splat”运营商不是一个正式名称,但它仍然很可爱!

皇甫展
2023-03-14

省略号(…)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

解包在使用数组函数操作数组或变量时特别有用。

例如,解压缩数组_切片的结果:

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
阎知
2023-03-14

…$str在PHP中称为splat操作符。

功能允许您捕获函数的可变数量的参数,如果您愿意,将其与传入的“正常”参数结合在一起。用一个例子最容易看出:

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

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

函数声明中的参数列表中有操作符,它的基本意思是“…其他所有内容都应包含在$strings中”。您可以将2个或多个参数传递到此函数,第二个和后续的参数将添加到$strings数组中,以备使用。

 类似资料:
  • 问题内容: PHP中的三点(…)是什么意思? 当我在服务器中安装Magento 2时,出现错误。检查该代码,发现有一个三点(…),这会产生错误。我在下面提到了代码 问题答案: 在被称为在PHP图示操作。 此功能使您可以捕获函数的可变数量的参数,并根据需要传递传入的“普通”参数。举个例子最容易看到: 函数声明中的参数列表中包含运算符,它的基本含义是“ …以及其他所有内容都应放入$ strings中”

  • 问题内容: 据我所知,“ …”表示下面代码段中数组的长度。 另一方面,正如我猜想的那样,“ …”表示将以下代码段中的切片拆分为int的参数。我对此不太确定。 现在,两种含义的差异使我很难理解“ …”是什么。 问题答案: 您已经注意到Go中的两种情况。实际上,有3个: 在编译时 评估为[3] int {1,2,3} 解压缩作为函数的参数。这与您错过的一个(可变参数的定义)相匹配: 现在是另一个问题(

  • 我正在学习node js,遇到了“

  • 问题内容: 什么是在这个做反应(使用JSX)代码,什么是它叫什么名字? 问题答案: 那是 财产传播符号 。它是在ES2018中添加的(用于数组/可迭代对象的版本早于ES2015),但是它在React项目中已经通过翻译长期得到支持(“ JSX传播属性 ”,即使您也可以在其他地方这样做) )。 将 “自己的”可枚举属性作为离散属性 散布 在要创建的元素上。例如,如果包含和,则 将与 但是它是动态的,因

  • 我正在使用一个特定的GraphQLendpoint,尽管我提供了一个干净的JSON结构作为查询,但当我获得结果时,我会得到“Edges”和“Node”标记。它似乎在污染我的数据,没有明显的好处。为什么会有它,是否有可能为了更快、更简单地解析数据而去掉它们?

  • 问题内容: 什么是在这个做反应(使用JSX)代码,什么是它叫什么名字? 问题答案: 那是 property spread notation。它是在ES2018中添加的(用于数组/可迭代对象的版本更早于ES2015),但是随着时间的流逝,它通过转译得到了支持(作为“ JSX spread attributes ”,即使你也可以在其他地方这样做,而不仅仅是属性) 。 将 “自己的”可枚举属性作为离散属