[ Goran Rakić @ 01.10.2010. 02:57 ] @
Imam mali problem koji ću ilustrovati primerom koda: Code (php): class Delegate {} class CustomDelegate extends Delegate {} interface Listener { public function add(Delegate $d); } /** * Prihvata samo CustomDelegate */ class CustomDelegateListener implements Listener { public function add(CustomDelegate $d) {} } Dakle imamo klasu Delegate i CustomDelegate koji je nasleđuje. Postoji Listener interfejs sa metodom koja prima Delegate. Međutim naš CustomDelegateListener koji implementira ovaj interfejs ne želi da primi bilo koji Delegate već baš CustomDelegate, tj. da postavi ovaj strožiji typehint. Ovaj kod daje: PHP Fatal error: Declaration of CustomDelegateListener::add() must be compatible with that of Listener::add() Probao sam da izbacim typehint iz interfejsa, ali ni to ne pomaže. PHP traži da izbacim typehint i iz interfejsa i iz CustomDelegateListener klase. Probao sam da definišem izvedeni interfejs i da postavim da CustomDelegateListener implementira njega: Code (php): interface CListener extends Listener { public function add(CustomDelegate $d); } Međutim PHP tada kaže Can't inherit abstract function Listener::add() (previously declared abstract in CListener) tj. ne da mi da u izvedenom interfejsu promenim potpis metode, mada mi je malo čudan redosled u ovoj poruci. Jedino rešenje do koga sam došao (osim da uklonim svuda typehint, što ne želim) je da definišem osnovni interfejs sa svim metodama bez zavisnog typehinta i onda izvedem dva druga interfejsa, jedan za osnovnu i drugi za posebnu klasu: Code (php): interface BaseListener {} interface Listener extends BaseListener { public function add(Delegate $d); } interface CListener extends BaseListener { public function add(CustomDelegate $d); } Postoji li lepše rešenje? Pretragom po vebu došao sam do http://bugs.php.net/bug.php?id=51542&edit=1 i http://p3d.co.uk/blog/?p=88 ali tamo nema korisnih saveta. [Ovu poruku je menjao Goran Rakić dana 01.10.2010. u 04:07 GMT+1] |