Autor | Zpráva | ||
---|---|---|---|
tatyalien Profil |
#1 · Zasláno: 12. 3. 2016, 21:50:12
Ahoj,
jde nějak definovat interface pro metodu xy, která bude mít parametr "abstraktní" třídu. A v definici třídy dosadit potomka? v níže uvedeném kódu vše funguje pokud je parametr definovaný jako AFilter, ale pro napovídání v kódu bych potřeboval, aby byl parametr FullFilter. Pokud definuji parametr jako třídu FullFilter (i když je potomek AFilter) tak vyskočí chyba, Strict standards Declaration of Example::getByFilter() should be compatible with IExample::getByFilter(AFilter $filter) Příklad abstract class AFilter { public $id; } class FullFilter extends AFilter { public $where = []; } interface IExample { public function getByFilter(AFilter $filter); } class Example implements IExample { // takto funguje public function getByFilter(AFilter $filter) // takto ne //public function getByFilter(FullFilter $filter) { return "test"; } } |
||
Zechy Profil |
tatyalien:
Pro napovídání v editoru mu můžeš speciálně říct, že ta proměnná je jiné třídy: <?php class Example implements IExample { public function getByFilter(AFilter $filter) { /** @var FullFilter $filter */ // Při dalším použití by měl editor našeptávat vše, co nabízí třída FullFilter. } } EDIT: Ale takhle to zavání zřejmě špatným návrhem, když dáváš jako parametr nějakou výchozí třídu nebo interface, měl by si správně pracovat pouze s tím, co nabízí třída v typehint. Takhle vlastně říkáš, ať ta třída vypadá jakkoli, ale pro práci v té funkci potřebuješ, aby byla potomkem dané třídy nebo interfacu, protože jejich metody/atributy chceš využívat. Co když ti tam někdo strčí FullFilter, který nebude mít public $where? |
||
tatyalien Profil |
No AFilter beru jako základní obálku nad filtrem (který má například jen getFilter). Z které dědí různé typy filtrů (například UserFilter který má v sobě id, name, surname,..., dále pak může být filtr CarFilter který má typ, značka,...) atd...
A pak repositář dědí ze základního repozitáře,který má v sobě abstraktní metodu getByFilter, kterou si dodefinuje UserRepository a CarRepository a tady jsem právě v koncích... |
||
Časová prodleva: 9 let
|
0