在PHP 7中,动态地将多个类型提示的对象传递到类的构造函数中。

4

假设我在类的构造函数中对一系列值进行接口类型提示:

<?php

use Interfaces\Item;

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

我可以很容易地手动传递这些项目:

$myclass = new MyClass($item1, $item2);

但我很难让它更加动态化-以下代码无法工作,因为它期望接收多个Item实例,而不是一个数组,所以会引发TypeError错误:

$items = [
    $item1,
    $item2
];
$myclass = new MyClass($items);

我想不到一种动态构建所需传递项的方法,而不改变它以期望一个数组,并且我不愿意这样做,因为类型提示显然会捕获任何不应通过的对象。有人能看出我如何实现吗?


它期望多个变量,而你正在传递一个包含多个项的单个变量。我不认为这会起作用。你可以尝试使用 eval 或其他方法,但这不是你应该采取的方式。 - Phiter
如果你真的想这样做,那么你应该在函数中只接受一个变量。 - Phiter
2个回答

4

在函数定义时,展开操作符(...)有两种用法:一种是在函数定义中使用,就像你已经做过的那样;另一种是将数组中的项展开为函数参数。

试一试:

$myclass = new MyClass(...$items);

完整示例请参见https://eval.in/927133


-2

你可以使用数组来创建新的类:

<?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.*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接