2013-03-05 97 views
2

像那樣的代碼:PHP OOP界面分類繼承

interface entite 
{ 

} 

class Foo implements entite 
{ 

} 


$foo = new foo; 
if($foo instanceof entite) echo "he is"; 

顯示 「他」。富繼承型 「entite」 從接口 但是,當嘗試:

class FooDeleter implements deleter 
{ 
public function __construct(Foo $Foo) 
{ 

} 
} 

interface deleter 
{ 
public function __construct(entite $entite); 
} 

給我:

Fatal error: Declaration of FooDeleter::__construct() must be compatible with deleter::__construct(entite $entite)

爲什麼?如何 ? =(

編輯:獨特的方式實際上是定義類型化缺失者這樣的:

class FooDeleter implements deleter 
{ 
public function __construct(entite $Foo) 
{ 
    if($Foo instanceof Foo) { ... }  
} 
} 
+4

希望你的意思是「OOP接口」? – 2013-03-05 01:53:32

+1

這是來自Big Brown Book of PHP的示例代碼。 – 2013-03-05 02:03:24

+2

我很驚訝PHP允許您在界面中定義構造函數。對我來說似乎是一個可怕的想法。相關問題在這裏 - http://stackoverflow.com/questions/783046/constructor-methods-in-interfaces – Phil 2013-03-05 03:12:47

回答

2

通過與類型提示比界面更加嚴格,你違反了接口聲明的FooDeleter構造。

如果你改變了你的構造函數

public function __construct(entite $Foo) 

...那麼你仍然可以傳遞一個Foo OBJE ct,並且接口將被正確實現。

1

根據PHP Document

注意

實現接口必須使用完全相同的方法簽名在接口中定義的類。不這樣做會導致致命的錯誤。

函數名稱和參數編號以及參數類型(如果指定)是方法簽名的部分(全部?),因此您必須聲明完全相同的方法。你可以使用new FooDeleter($foo)