当我在服务器上安装Magento 2时,我得到了一个错误。在调查代码后,发现有三个点(…),这是产生错误。我附上了我在下面找到的代码:
return new $type(...array_values($args));
这个运算符叫什么,它的目的是什么?
当我在服务器上安装Magento 2时,我得到了一个错误。在调查代码后,发现有三个点(…),这是产生错误。我附上了我在下面找到的代码:
return new $type(...array_values($args));
这个运算符叫什么,它的目的是什么?
当前回答
在PHP 8.1中,语法“(…)”被用作创建可调用对象的新方法。
PHP 8.1之前:
$callable = [$this, 'myMethod'];
PHP 8.1之后:
$callable = $this->myMethod(...);
来源:https://wiki.php.net/rfc/first_class_callable_syntax
其他回答
每个答案都引用了同一篇博客文章,除此之外,这里是关于变长参数列表的官方文档:
http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list
在PHP 5.6及以后版本中,参数列表可能包括…标记,表示函数接受可变数量的参数。参数将作为数组传递给给定的变量
看来“啪啪”运算符不是一个正式的名字,不过还是挺可爱的!
这就是所谓的“splat”运算符。基本上这句话的意思是“任意数量的参数”;由PHP 5.6引入
详情请看这里。
在PHP 8.1中,语法“(…)”被用作创建可调用对象的新方法。
PHP 8.1之前:
$callable = [$this, 'myMethod'];
PHP 8.1之后:
$callable = $this->myMethod(...);
来源:https://wiki.php.net/rfc/first_class_callable_syntax
意思是它将一个关联数组分解为一个列表。因此,您不需要键入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需要使用…将数组解压缩为变量。操作符。更多细节请看这里,一个简单的例子可以是这样的:
$email[] = "Hi there";
$email[] = "Thanks for registering, hope you like it";
mail("someone@example.com", ...$email);