2016-04-03 63 views
0

在因爲接口的好處PHP可以使用通過傳遞作爲參數提接口名稱類似將一組接口傳遞給一個函數?

public function foo (Abc $abc){} 

其中ABC是interface.But我如何通過這些接口的陣列?

請注意,這不是階級,但界面和只得到好處接口被傳遞作爲函數類型提示

+1

在哈克朗(Facebook擴展的PHP語言)中,您可以通過'Vector '鍵入提示向量(零索引列表)。可惜的是PHP本身並沒有提供這個afaik,至少現在還沒有。儘管如此,你可以繞過它:[確保你正在使用「Array of Foo」](http://stackoverflow.com/questions/20763744/type-hinting-specify-an-array-of-objects) – JimL

+0

它是顯然不可能。 –

+0

爲什麼你不能傳遞接口abc並且需要pas數組? – Naumov

回答

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

如果您使用PHP 5.6+可以使用可變參數與Decorator模式:

<?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實例以外的任何內容,則將引發錯誤。

這是一個小小的'hacky',但它是獲得PHP中數組類型提示的唯一方法,不需要放下一些額外的代碼。

+0

這個問題不是關於接受不同接口的能力,而是傳遞一組接口 –

+0

對不起,它看起來像我誤解了這個問題。我更新了我的答案。 –

相關問題