在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)
)。
任何帮助都将不胜感激。
答案 0 :(得分:3)
一个选项(需要PHP> = 5.6.0)是将方法定义为
public function __construct(Toggleable ...$devices)
但你必须在两边使用阵列打包/拆包;构造函数以及实例化对象的位置,例如
$toggleAbles = [new Toggleable(), new Toggleable()];
$toggler = new Toggler(...$toggleAbles);