interface és osztályleszármaztatás
adott a következő konstrukció: erre a php fatal errorral elszáll, hogy Declaration of c2::foo() must be compatible with that of i::foo(). namost a kérdés a következő: tudom, hogy a php nem virtuálisként kezeli a fv-eket (így valahol jogos a viselkedése), és hogy végülis a self megoldja a dolgot, de nem tud e valaki mégis valami megoldást rá, hogy ezt rákényszerítsem a php-re? (pl. előfordulhat olyan helyzet, ahol a self nem jó, mivel nem akarom szűkíteni a foo számára megadható osztályokat). jelenleg nálam php 5.2.3 fut
■ interface i
{
public function foo(c1 $var);
}
class c1 implements i
{
public function foo(c1 $var)
{
//do nothing
}
}
class c2 extends c1
{
public function foo(c2 $var)
{
//do nothing
}
}
Valóban jogos, amit a PHP csinál, hiszen a i::foo()-hoz...
Alternatív megoldás: biztos, hogy neked interéfsz kell? Absztrakt osztállyal vihogva meg lehetne csinálni, valahogy így (tudom, nem szép és nem is jó, ha c1 is kiterjeszt egy másik osztályt, mer akkor értelmetlen, ugyanis multiple extends-re lenne szükség, azt meg a php nem ismeri és megtanítani is nehéz rá, bár runkittel nem lehetetlen):
öröklődés
amit írsz, hogy absztrakt osztályból származtatom a dolgot, az is valóban egy megoldás. de én szebbnek tartom, ha azért egy interfacet implementál. (egyébként az interfacet teljesítő ősosztály maga absztrakt, ettől függetlenül is)
technikai megjegyzés: nem statikus funkciók, szóval nem c2::foo(), hanem c2->foo(). nem kötözködés képpen.
Minden alma gyülölcs, de nem minden gyümölcs alma.
a szűkítés megfelel
Eléggé csúnyácska megoldás, de mindent tud, ami kell
__call
interfészre programozz
Üdv,
Felhő
interfacera tervezés
Esélytelen
szerk:
Na belefutottam én is ugyanebbe: