对象数组:如何确保接口

时间:2016-04-16 21:07:51

标签: php design-patterns interface

给出一个对象:

class MyObject implements MyInterface
{
   public function testMethod() {

   }
}

如果有另一个类使用了一个像MyInterface这样的对象数组:

class Consumer
{
    public function __construct(array $myInterfaces)
    {
         foreach($myInterfaces as $myI) {
            $myI->testMethod();
         }
    }

}

如果我知道我可以安全地对数组元素调用testMethod(),我怎样才能使我的程序设计健壮?

3 个答案:

答案 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的集合。

您已经有效地键入了集合构造函数接收的约束。