在PHP 7中将多个类型化对象动态传递到类的构造函数中

时间:2017-12-28 15:47:46

标签: php php-7

说我在类的构造函数中为一个接口输入一系列值:

<?php

use Interfaces\Item;

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

我可以轻松地手动传递这些项目:

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

但是我努力让它更动态地工作 - 以下不能正常工作,因为它希望接收多个Item实例而不是数组,因此它会提高{{1 }}:

TypeError

在构建新类时,我无法想出一种动态构建我想要传递的项目的方法,而不会将其更改为期望数组,我宁愿不这样做,因为类型提示显然会捕获任何不应该通过的物体。任何人都可以看到我如何实现这一目标吗?

2 个答案:

答案 0 :(得分:4)

splat运算符(...)有两种工作方式 - 您可以在函数定义中使用它,但您也可以使用它将项目数组解包为函数参数。

尝试:

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

有关完整示例,请参阅https://eval.in/927133

答案 1 :(得分:-2)

您可以使用数组创建新类:

Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
    Dim strFormat As New StringFormat()

    If e.Header.TextAlign = HorizontalAlignment.Center Then
        strFormat.Alignment = StringAlignment.Center
    ElseIf e.Header.TextAlign = HorizontalAlignment.Right Then
        strFormat.Alignment = StringAlignment.Far
    End If

    e.DrawBackground()
    e.Graphics.FillRectangle(Brushes.SteelBlue, e.Bounds)
    Dim headerFont As New Font("Arial", 8, FontStyle.Bold)

    e.Graphics.DrawString(e.Header.Text, headerFont, Brushes.White, e.Bounds, strFormat)
End Sub

Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem
    e.DrawDefault = True
End Sub