Ok, am impresia că s-a înțeles că nu știu acum la ce folosesc interfețele vs abstractele. În final am priceput, dar am avut nevoie de ceva timp pentru a procesa, până să facă acel „click”, când totul are sens
@adavidoaiei: interfețele nu au legătură cu moștenirile, cel puțin nu în PHP, unde o interfață conține doar semnăturile metodelor, fără nici un fel de cod.
Eu am priceput (și folosesc) interfețele pentru a fi sigur că o clasă implementează anumite metode.
De exemplu, la proiectul curent, am următoarea interfață:
interface FieldInterface {
public function getField();
}
Iar o metodă dintr-o altă clasă acceptă doar implementări ale acestei interfețe, astfel încât să nu mai verific dacă metoda getField
există, dacă parametri sunt OK șamd:
class FieldsGroup
{
public function addField(FieldInterface $field)
{
$field->getField();
}
}
Evident, $field
este definit cam așa:
class Field implements FieldInterface {
public function getField()
{}
}
Partea cu adevărat interesantă vine acum: eu pot trimite în FieldsGroup
orice clasă cât timp este o implementare a FieldInterface
. Și chiar așa fac, pentru că Field
este doar pentru exemplul de mai sus. În proiect am, de fapt: Select
, Textarea
etc (să zicem că e un generator de formulare).
Altfel spus, Design by contract.
Comparativ, abstractele sunt clase propriu-zise ce nu pot fi instanțiate, pot fi doar extinse. Pot implementa logică, pot conține și metode abstrace (ce vor fi obligatoriu de implementat de clasa ce o va extinde) șamd.
Din punctul meu de vedere (și din scurta mea experiență OOP) este greșit să folosești o abstractă pentru un Contract.