给出一个对象:
class MyObject implements MyInterface
{
public function testMethod() {
}
}
如果有另一个类使用了一个像MyInterface这样的对象数组:
class Consumer
{
public function __construct(array $myInterfaces)
{
foreach($myInterfaces as $myI) {
$myI->testMethod();
}
}
}
如果我知道我可以安全地对数组元素调用testMethod(),我怎样才能使我的程序设计健壮?
答案 0 :(得分:1)
您可以使用instanceof运算符。例如:
foreach ($objects as $object) {
if ($object instanceof Interface) {
$object->testMethod();
} else {
throw new InvalidArgumentException('All objects must implement Interface.');
}
}
在某些语言中,有类型化的数组,可以强制执行此操作(例如Java。)以上是PHP的一个示例,它没有类型化的数组。
答案 1 :(得分:0)
在PHP中使用class_implements('MyObject')
并循环生成结果数组。
答案 2 :(得分:0)
您可以使用类型提示(类型引用),如下所示:
class Consumer {
public function __construct(array $myInterfaces) {
foreach ($myInterfaces as $myI) {
$this->process($myI);
}
}
private function process(MyInterface $m) {
$m->testMethod();
}
}
因此,要避免致命错误,process()必须获取MyInterface的实例,并且通过扩展构造函数参数必须是MyInterfaces的集合。
您已经有效地键入了集合构造函数接收的约束。