Rozhraní v OOP v PHP
Jak již víte, abstraktní třídy představují soubor metod pro své potomky. Část těchto metod může být implementována v samotné třídě, a část metod může být deklarována jako abstraktní a vyžadovat implementaci v potomních třídách.
Představme si situaci, kdy vaše abstraktní třída představuje pouze soubor abstraktních veřejných metod, nepřidávající metody s implementací.
Fakticky vaše rodičovská třída popisuje rozhraní potomků, tedy soubor jejich veřejných metod, povinných pro implementaci.
K čemu nám to je dobré: abychom při programování dělali méně chyb - popsáním všech potřebných metod v rodičovské třídě můžeme být jisti tím, že je všichni potomci skutečně implementují.
Kdy to pomůže: řekněme, že vytvoříme naši rodičovskou třídu a několik potomků k ní. Pokud potom po nějaké době, například, za měsíc, se rozhodneme vytvořit dalšího potomka, určitě už zapomeneme detaily našeho kódu a klidně můžeme zapomenout napsat implementaci nějaké metody v novém potomkovi. Avšak samotný PHP nedovolí metodu ztratit - a jednoduše vypíše chybu.
To samé platí pro jiného programátora, pracujícího s vaším projektem. Řekněme, že kód rodičovské třídy jste psali vy, a poté se váš kolega rozhodl vytvořit ještě jednoho potomka. Ani vašemu kolegovi se nepodaří ztratit pár metod.
Existuje však problém: fakticky jsme udělali naši rodičovskou třídu proto, abychom psali v ní abstraktní veřejné metody, ale my sami nebo náš kolega máme možnost náhodně přidat do této třídy ne veřejnou metodu nebo ne abstraktní.
Řekněme, že chceme fyzicky zakázat dělat v rodiči jiné metody, kromě abstraktních veřejných. V PHP k tomu místo abstraktních tříd lze použít rozhraní.
Rozhraní představují třídy, u kterých všechny metody jsou veřejné a nemající implementaci. Kód metod musí implementovat třídy-potomci rozhraní.
Rozhraní se deklarují stejně jako obyčejné
třídy, ale pomocí klíčového slova interface
namísto slova class.
Pro dědění od rozhraní se používá
trochu jiná terminologie: říká se, že
třídy nedědí od rozhraní, ale implementují
je. Odpovídajícím způsobem místo slova extends
se používá klíčové slovo
implements.
Nelze vytvořit objekt rozhraní. Všechny metody
rozhraní musí být deklarovány jako public
a nesmí mít implementaci. Rozhraní
může mít pouze metody, ne vlastnosti.
Nelze také vytvořit rozhraní a třídu se
stejným názvem.