2011-01-29 60 views
1

,我有以下的代碼所有的地方:PHP typehint專業化沒有實際的方法聲明

class Container extends Object implements \IteratorAggregate { 

    public function AddObject(Object $object, $instanceKey) { 
     ... 
    } 

    public function AddComponent(Component $component) { 
     ... 
    } 
} 

class MenuContainer extends Container { 

    public function AddComponent(Menu $component) { // <-- I'm redeclaring the method only because I need to change the typehint 
     return parent::AddComponent($component);// I don't do anything useful here 
    } 

    public function AddObject(Menu $object, $instanceKey) { // <-- I'm redeclaring the method only because I need to change the typehint 
     return parent::AddObject($object, $instanceKey); // I don't do anything useful here 
    } 
} 

我不得不通過重新聲明的方法做typehint專業化,因爲我想,以防止有人正在使用我的代碼從做錯誤和意外添加一些不兼容的菜單。所以問題:沒有實際的方法重新聲明,是否有一種做typehint專業化的方法?

回答

0

而是專業的方法,專門你傳遞的類型:

class Foo { } 
class Bar extends Foo { } 

class Container extends Object implements \IteratorAggregate { 

    public function AddObject(Foo $menu) { } 

} 

Container::AddObject(new Bar()); 
+0

謝謝你的回答,但是,我想你已經錯過了點deceze。在你的例子中,你允許「Container :: AddObject(new Foo())」和「Container :: AddObject(new Bar())」。但在我的情況下,當酒吧被允許時,Foo是不允許的。而專業化的字體有助於做到這一點。但它迫使我創建大量的魚類方法,除了「return parent :: AddComponent($ component);」之外,它沒有做任何有用的操作。所以我不想在派生類中創建這些魚類方法,但要改變類型提示。 – Lu4 2011-01-30 20:47:28