| 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: 10 let
|
|||
0