Rozhrania v OOP v PHP
Ako už viete, abstraktné triedy predstavujú súbor metód pre svojich potomkov. Časť týchto metód môže byť implementovaná v samotnej triede, a časť metód môže byť deklarovaná ako abstraktné a vyžadovať implementáciu v odvodených triedach.
Predstavme si situáciu, keď vaša abstraktná trieda predstavuje len súbor abstraktných verejných metód, bez pridania metód s implementáciou.
Fakticky vaša nadradená trieda popisuje rozhranie potomkov, teda súbor ich verejných metód, povinných pre implementáciu.
Načo to potrebujeme: aby sme pri programovaní robili menej chýb - popísaním všetkých potrebných metód v nadradenej triede môžeme byť istí v tom, že všetci potomkovia ich naozaj implementujú.
Kedy to pomôže: povedzme, že vytvoríme našu nadradenú triedu a niekoľko potomkov k nej. Ak potom po určitom čase, napríklad, po mesiaci, sa rozhodneme vytvoriť ďalšieho potomka, určite už zabudneme detaily nášho kódu a celkom môžeme zabudnúť napísať implementáciu nejakej metódy v novom potomkovi. Avšak samotný PHP nedovolí stratu metódy - a jednoducho vypíše chybu.
To isté platí pre iného programátora, ktorý pracuje na vašom projekte. Nech kód nadradenej triedy písali ste vy, a potom sa váš kolega rozhodol vytvoriť ďalšieho potomka. Aj váš kolega nebude schopný stratiť pár metód.
Je tu však problém: fakticky sme urobili našu nadradenú triedu preto, aby sme písali v nej abstraktné verejné metódy, ale my sami alebo náš kolega máme možnosť náhodne pridať do tejto triedy nie verejnú metódu alebo nie abstraktnú.
Povedzme, že chceme fyzicky zakázať robiť v nadradenej triede iné metódy, okrem abstraktných verejných. V PHP na to namiesto abstraktných tried môžeme použiť rozhrania.
Rozhrania predstavujú triedy, ktorých všetky metódy sú verejné a nemajú implementáciu. Kód metód musia implementovať triedy-potomkovia rozhraní.
Rozhrania sa deklarujú rovnako ako obyčajné
triedy, ale pomocou kľúčového slova interface
namiesto slova class.
Pre dedenie od rozhraní sa používa
trochu iná terminológia: hovorí sa, že
triedy nededia od rozhraní, ale implementujú
ich. Zodpovedajúco namiesto slova extends
sa používa kľúčové slovo
implements.
Nie je možné vytvoriť objekt rozhrania. Všetky metódy
rozhrania musia byť deklarované ako public
a nesmú mať implementáciu. Rozhranie
môže mať len metódy, nie vlastnosti.
Taktiež nie je možné vytvoriť rozhranie a triedu s
rovnakým názvom.