将一组接口传递给一个函数?

时间:2016-04-03 17:09:32

标签: php interface

在PHP中,因为接口的好处可以通过传递参数来提及接口名称类似

public function foo (Abc $abc){}

其中Abc是一个接口。但是我如何传递这些接口的数组呢?

请注意,这不是类,而是界面,只有获得界面的方法是通过类型提示传递函数

3 个答案:

答案 0 :(得分:1)

在PHP 5.6+中你可以这样做:

function foo(Abc ...$args) {

}

foo(...$arr);

foo()接受类型为Abc的可变数量的参数,并通过调用foo(...$arr)将解包$arr解压缩到参数列表中。如果$arr包含Abc个实例以外的任何内容,则会抛出错误。

这有点'hacky',但它是在PHP中为数组提示类型提示的唯一方法,而不会放下一些额外的代码。

答案 1 :(得分:0)

不幸的是,你不能在PHP中使用type hinting同时检查两个不同的接口,但你可以为此编写一个函数来检查对象是否属于多个接口,例如 -

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
   }
}

答案 2 :(得分: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();
    }
}