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



当我在服务器上安装Magento 2时,我遇到了一个错误。在研究了代码后发现有三个点(...),它们正在产生错误。我包括下面发现的代码:

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

这个操作员叫什么,其目的是什么?

这实际上称为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

函数声明中的参数列表中有...运算符,基本上是指"...其他一切都应该进入$strings。您可以将2个或多个参数传递到此功能中,第二个及以后的参数将添加到$ strings array中,可以使用。

有两种用途用于省略(...)php令牌 - 将它们添加到 packing andar和解开包装数组。这两个目的都适用于函数参数。


pack

定义一个函数时,如果您需要提供给该功能的动态数量的变量(即,在代码中调用时,您不知道该函数将提供多少个参数),前缀省略(...)令牌到可变名称 - e.g。, ...$numbers-捕获所有(剩余的)参数提供给该函数的参数中分配给了命名变量的数组 - 在这种情况下,在这种情况下,该函数可访问该功能。堵塞。前缀省略(...)捕获的参数数量可能为零或更多。

例如:

// 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

...前缀的省略号变量将捕获其余的所有内容。因此,它必须是最终函数参数。


uncack

另外,当调用 时,如果您提供给该函数的参数先前已合并到数组中,请使用eLLIPSIS(...)令牌前缀的变量" inline"将该数组变量转换为提供给该函数的单个参数。当任意数量的函数参数被省略于前缀变量替换时,每个数组元素都会分配给函数定义中命名的相应函数参数变量。

例如:

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 "$onen$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

每个答案都引用了同一博客文章,除了它们之外,这是有关 act_s> car> car> car> car>变量长度参数列表的官方文档:

http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list

在PHP 5.6及以后,参数列表可能包括...表示该函数接受可变数量的参数的象征。这些参数将作为数组

传递到给定的变量中

似乎" splat"运算符不是正式名称,仍然很可爱!

意味着它将关联数组分解为列表。因此,您无需键入n个参数即可调用方法,只有一个。如果方法允许分解参数和参数是相同类型的参数。

对我来说,SPLAT运算符最重要的是它可以帮助键入typehint数组参数:

$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的类型是,但CC_9确实会分解一个数组,因此您也可以采取丑陋的方式:

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 Update-命名参数

由于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 8.1 中,此语法"(...)被用作创建可可的新方法。

php 8.1之前:

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

php 8.1之后:

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

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

<<div>

使用此功能使用... operator将数组成变量。有关更多详细信息,请参见此处,一个简单的示例可能会如下:

$email[] = "Hi there";
$email[] = "Thanks for registering, hope you like it";
mail("someone@example.com", ...$email);

这就是所谓的" splat"运算符。基本上,那东西转化为"任何数量的参数";用php 5.6

引入

有关更多详细信息,请参见此处。

看来没有人提到过它,因此在这里留下来[它也将帮助Google(&amp; otherSES)指南Devs在PHP 中要求]:

如下所示,其称为 REST参数在JS&amp;我更喜欢这个有意义的命名,而不是那个splat的东西!

在PHP中, ... Args 提供的功能称为variadic函数,该功能在PHP5.6上引入。使用func_get_args()实现相同的功能。

为了正确使用它,您应该使用REST参数语法,任何帮助还原样板代码

相关内容

最新更新