2016-04-03 16 views
0

インターフェースの利点は、ABCはinterface.Butでどのように私は、これらのインタフェースの配列を渡すんインターフェイスの配列を関数に渡しますか? PHPで

public function foo (Abc $abc){} 

のようなインタフェース名の何かを言及するパラメータとして渡すことで使用することができますので、?

インターフェースの利点を得るために、このクラスではなくなく、インタフェースとの唯一の方法は、残念ながら

+1

Hacklang(Facebookの拡張PHP言語)では、ベクトルを使って、ベクトル(ゼロインデックス付きリスト)のヒントを入力できます。残念なことにPHP自体は、少なくともまだこのafaikを提供していません。あなたはそれの周りにあなたの道をハックすることができます:[あなたが "Fooの配列"で作業していることを確認する](http://stackoverflow.com/questions/20763744/type-hinting-specify-an-array-of-objects) – JimL

+0

それはです明らかに不可能です。 –

+0

なぜあなたはインターフェイスabcを渡すことができないし、pas配列が必要ですか? – Naumov

答えて

0

をヒンティングのタイプを持つ関数として渡しとなりますのでご注意ください、あなたは、PHPでtype hintingを使用して、同時に2つの異なるインターフェイスをチェックし、しかし、あなたすることはできませんオブジェクトが複数のインターフェイスに属しているかどうかをチェックします。このための機能、例えば書くことができます -

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

あなたはDecoratorパターンで可変長引数を使用することができ5.6+ PHPを使用する場合:

function foo(Abc ...$args) { 

} 

foo(...$arr); 

foo()は、型の引数の可変量を取る:あなたはこのような何かを行うことができ5.6+ PHPで

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

Abcを呼び出し、foo(...$arr)を呼び出すと、$arrを引数のリストに展開します。 $arrAbcのインスタンス以外が含まれていると、エラーがスローされます。

これはちょっとハッキリですが、PHPで配列の型ヒントを取得する唯一の方法ですが、いくつかのコードを追加する必要はありません。

+0

質問は、異なるインタフェースを受け入れる能力についてではなく、むしろインタフェースの配列を渡すことです。 –

+0

私は申し訳ありませんが、私は質問を誤解したように見えます。私は自分の答えを更新しました。 –

関連する問題