2016-04-03 3 views
0

В PHP, поскольку преимущества интерфейса может использоваться, передавая в качестве параметра упоминая имя интерфейса что-то вродеПередайте массив интерфейсов в функцию?

public function foo (Abc $abc){} 

где Abc является interface.But как я передать массив этих интерфейсов?

Обратите внимание, это не класс, но интерфейс и единственный способ получить преимущество интерфейса проходит как функция с типом намекая

+1

В Hacklang (расширенный язык PHP для Facebook) вы можете использовать 'Vector ' для ввода подсказки Vector (нулевой индексный список). К сожалению, сам PHP не предлагает этот афайк, по крайней мере, пока. Вы могли бы взломать свой путь, хотя: [убедитесь, что вы работаете с «Array of Foo»] (http://stackoverflow.com/questions/20763744/type-hinting-specify-an-array-of-objects) – JimL

+0

Это очевидно, невозможно. –

+0

Почему вы не можете передать интерфейс abc и нужен массив pas? – Naumov

ответ

0

К сожалению, вы не можете проверить для двух различных интерфейсов, в то же время, используя type hinting в PHP, но вы может написать функцию для этого, который будет проверять, если объект принадлежит нескольким интерфейсам, например -

function belongs_to_Interfaces($obj,array $interfaces) 
{ 
    foreach($interfaces as $interface) 
    { 
     if(!is_a($obj,$interface)) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

Вы можете использовать его, как это,

public function foo ($abc){ 
    if(!belongs_to_Interfaces($abc, ['interface1', 'interface2'])){ 
     //throw an error or return false 
    } 
} 
0

если вы используете PHP 5.6+ вы можете использовать VARIADIC с декораторами:

<?php 

interface Rule { 
    public function isSatisfied(); 
} 

final class ChainRule implements Rule { 
    private $rules; 

    public function __construct(Rule ...$rules) { 
     $this->rules = $rules; 
    } 

    public function isSatisfied() { 
     foreach($this->rules as $rule) 
      $rule->isSatisfied(); 
    } 
} 
1

В PHP 5.6+ вы могли бы сделать что-то вроде этого:

function foo(Abc ...$args) { 

} 

foo(...$arr); 

foo() принимает переменное количество аргументов типа Abc, и вызывая foo(...$arr), вы распаковываете $arr в список аргументов. Если $arr содержит что-либо, кроме экземпляров Abc, будет выдана ошибка.

Это немного «взломанный», но это единственный способ получить тип намека на массив в PHP, не откладывая лишний код.

+0

вопрос не о способности принимать разные интерфейсы, а скорее передавать массив интерфейсов –

+0

Извините, похоже, я неправильно понял вопрос. Я обновил свой ответ. –

Смежные вопросы