Autor Zpráva
tatyalien
Profil
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...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: