在PHP7中动态地将多个typehinted对象传递到类的构造函数中

在PHP7中动态地将多个typehinted对象传递到类的构造函数中,php,php-7,Php,Php 7,假设我在类的构造函数中向接口键入一系列值: <?php use Interfaces\Item; class MyClass { public function __construct(Item ...$items) { // Do stuff } } 但我正在努力让它更动态地工作-以下操作不起作用,因为它希望接收多个项的实例而不是一个数组,所以它会引发类型错误: $items = [ $item1, $item2 ]; $my

假设我在类的构造函数中向接口键入一系列值:

<?php

use Interfaces\Item;

class MyClass
{
    public function __construct(Item ...$items)
    {
        // Do stuff
    }
}
但我正在努力让它更动态地工作-以下操作不起作用,因为它希望接收多个
项的实例而不是一个数组,所以它会引发
类型错误

$items = [
    $item1,
    $item2
];
$myclass = new MyClass($items);
我想不出一种方法,在构建新类时动态构建我想要传递的项,而不将其更改为期望数组,我不希望这样做,因为类型提示显然会捕获传递的任何不应该是数组的对象。有人知道我是如何做到这一点的吗?

splat操作符(
)有两种工作方式-您可以在函数定义中使用它,就像您已经使用过的那样,但也可以使用它将项数组解压到函数参数中

尝试:


有关可使用数组创建新类的完整示例,请参见:

<?php

use Interfaces\Item;

class MyClass
{
    public function __construct(array $items)
    {
        // Do stuff
    }
}


$myclass = new MyClass([$item1, $item2 ,...]); //php7.*

$myclass = new MyClass(array($item1, $item2 ,...)); //php5.*

它需要多个变量,您传递的是一个变量和多个项目。我认为这行不通。您可以尝试使用eval或其他方法,但这不是您应该做的。如果您真的想这样做,您应该只接受函数中的单个变量。
$myclass = new MyClass(...$items);
<?php

use Interfaces\Item;

class MyClass
{
    public function __construct(array $items)
    {
        // Do stuff
    }
}


$myclass = new MyClass([$item1, $item2 ,...]); //php7.*

$myclass = new MyClass(array($item1, $item2 ,...)); //php5.*