PHP类型提示对象数组

时间:2017-04-13 18:25:58

标签: php arrays type-hinting

在PHP中检查数组类型的最佳方法是什么?

假设我有以下内容:

class Toggler
{

    protected $devices;

    public function __construct(array $devices)
    {
        $this->devices = $devices;
    }

    public function toggleAll()
    {
        foreach ($this->devices as $device)
        {
            $device->toggle();
        }
    }

}

这里发生的事情很简单:Toggler类需要一系列“设备”,在这些设备上循环并调用toggle()方法。

然而,我想要的是,设备数组必须只包含实现Toggleable接口的对象(这会告诉对象提供toggle()方法)。

现在我做不到这样的事,对吧?

class Toggler
{

    protected $devices;

    public function __construct(Toggleable $devices)
    {
        $this->devices = $devices;
    }

    public function toggleAll()
    {
        foreach ($this->devices as $device)
        {
            $device->toggle();
        }
    }

}

据我所知你不能输入数组,因为PHP中的数组没有类型(与C ++之类的语言不同)。

您是否需要检查每个设备的循环类型?抛出异常?什么是最好的事情?

class Toggler
{

    protected $devices;

    public function __construct(array $devices)
    {
        $this->devices = $devices;
    }

    public function toggleAll()
    {
        foreach ($this->devices as $device)
        {
            if (! $device instanceof Toggleable) {
                throw new \Exception(get_class($device) . ' is not does implement the Toggleable interface.');
            }

            $device->toggle();
        }
    }

}

有更好,更清洁的方法吗?我想当我写这个伪代码时,你还需要检查设备是否完全是一个对象(否则你不能做get_class($device))。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

一个选项(需要PHP> = 5.6.0)是将方法定义为

public function __construct(Toggleable ...$devices)

但你必须在两边使用阵列打包/拆包;构造函数以及实例化对象的位置,例如

$toggleAbles = [new Toggleable(), new Toggleable()];
$toggler = new Toggler(...$toggleAbles);