2016-04-16 2 views
0

Учитывая объект:Массив объектов: как обеспечить интерфейс

class MyObject implements MyInterface 
{ 
    public function testMethod() { 

    } 
} 

Если будет еще один класс, что использует массив объектов, которые implment MyInterface так:

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

} 

Как может я сделать мой дизайн программы надежным, где я знаю, что я могу безопасно вызвать testMethod() против элементов массива?

+1

Err, это Java или PHP? – Tunaki

+0

я думаю язык неспециалист. Я добавил тег java, поскольку java по моему мнению очень сильно основан на шаблонах oop и design. Но мне пришлось написать пример на каком-то языке –

+0

Я не понимаю вопроса. Почему в нем есть фрагмент PHP и Java? Точно вы пытаетесь это сделать? Вы пытаетесь каким-то образом общаться между Java и PHP? – Tunaki

ответ

1

Вы можете использовать оператор instanceof. Например:

foreach ($objects as $object) { 
    if ($object instanceof Interface) { 
     $object->testMethod(); 
    } else { 
     throw new InvalidArgumentException('All objects must implement Interface.'); 
    } 
} 

В некоторых языках есть набираются массивы, которые могут применять этот приведенный выше пример для PHP, который не имеет типизированных массивов (например, Java.).

0

В PHP используйте class_implements('MyObject') и пройдите через результирующий массив.

0

Вы можете использовать тип намекая (ссылки типа), как так:

class Consumer { 

    public function __construct(array $myInterfaces) { 
     foreach ($myInterfaces as $myI) { 
      $this->process($myI); 
     } 
    } 

    private function process(MyInterface $m) { 
     $m->testMethod(); 
    } 

} 

Таким образом, чтобы избежать фатальной ошибки, процесс() должен получить экземпляр MyInterface и расширением конструктора аргумент должен быть коллекцией MyInterfaces.

Вы эффективно вводите ограничение, получаемое конструктором коллекции.

+0

php7 фактически сделает процесс() выкидывает исключение TypeError в случае неправильного переданного типа, что дает возможность вашему конструктору генерировать исключение с соответствующим сообщением об ошибке, описывающим, что неправильно с полученной им коллекцией. – Weltschmerz