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

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

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


当前回答

在PHP 7.4中,省略号也是展开操作符:

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

来源:https://wiki.php.net/rfc/spread_operator_for_array

其他回答

这就是字面上的意思。PHP中的splat操作符,但在其他语言中被称为splat操作符。2014年LornaJane的一篇博客文章中提到:

这个特性允许您捕获一个函数的可变数量的参数,如果您愿意,还可以结合传入的“普通”参数。最简单的例子是: 函数连接($transform,…$strings) { $string = "; Foreach ($strings作为$piece) { $string .= $piece; } 返回(转换美元($ string)); } echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");

(这将打印我想要6个苹果)

函数声明中的参数列表具有…运算符在里面,基本上意思是“…其他的都应该放到$strings中。您可以向该函数传递2个或更多参数,第二个和后续的参数将被添加到$strings数组中,随时可以使用。

在PHP 8.1中,语法“(…)”被用作创建可调用对象的新方法。

PHP 8.1之前:

$callable = [$this, 'myMethod'];

PHP 8.1之后:

$callable = $this->myMethod(...);

来源:https://wiki.php.net/rfc/first_class_callable_syntax

这就是所谓的“splat”运算符。基本上这句话的意思是“任意数量的参数”;由PHP 5.6引入

详情请看这里。

意思是它将一个关联数组分解为一个列表。因此,您不需要键入N个参数来调用方法,只需键入一个参数即可。方法允许分解参数,且If参数具有相同类型。

对我来说,splat操作符最重要的是它可以帮助输入提示数组参数:

$items = [
    new Item(), 
    new Item()
];

$collection = new ItemCollection();
$collection->add(...$items); // !

// what works as well:
// $collection->add(new Item());
// $collection->add(new Item(), new Item(), new Item()); // :(

class Item  {};
 
class ItemCollection {
    
    /**
     * @var Item[]
     */
    protected $items = [];
    
    public function add(Item ...$items)
    {
        foreach ($items as &$item) {
            $this->items[] = $item;
        }
    }
} 

它在类型控制方面节省了一些精力,特别是在处理庞大的集合或非常面向对象的集合时。

值得注意的是……不管数组元素的类型是什么,$array都可以分解数组,所以你也可以这样做:

function test(string $a, int $i) {
    echo sprintf('%s way as well', $a);
    
    if ($i === 1) {
        echo('!');
    }
}

$params = [
    (string) 'Ugly',
    (int) 1
];

test(...$params);

// Output:
// Ugly way as well!

但是请不要这样做。


PHP 8更新命名的参数

从PHP 8开始,你现在可以分解关联数组,也就是值有键的数组。如果你在有相同参数的函数中使用它,PHP会将值传递给适当的变量:

$arr = [
  'pi' => 3.14,
  'r' => 4,
];

function circ($r, $pi) {
    return 2*$pi*$r;
}

// so that call
circ(...$arr);

// will be effectively a call of
circ(pi: 3.14, r: 4);

你可以稍微少考虑参数的顺序。


PHP 8.1更新——创建可调用对象的新语法

尽管使用数组,…赢得了一个全新的,非常有用的功能,帮助创建可调用的任何上下文:

$f = strtoupper(...); // creating a callable
echo $f('fo');

class test {
    public function func($a) {
        echo $a . PHP_EOL;
    }
}

$f = (new test)
         ->func(...); // creating a callable

$f('x');

在PHP 7.4中,省略号也是展开操作符:

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

来源:https://wiki.php.net/rfc/spread_operator_for_array