polonium
Proč mimo třídu vytvořím rozhraní (interface) a poté jej zahrnu (implements) do třídy, když v ní právě tyto dvě funkce jsou. Využítí objektového rozhraní mi přijde celkem nepoužitelné.
interfaces význam mají, ale nesmíš o nich přemýšlet takto jednotlivě, nýbrž v kontextu celé aplikace. Použiju terminologii z trochu jiného jazyka – Objective-C –, protože mi přijde názornější. V ObjC se interfaces nazývají protokoly. Co je protokol víš, ne? Např. HTTP[1] je protokol pro přenášení HyperTextu a zároveň je to protokol, jímž přijde i tahle stránka do tvého počítače. Protokol specifikuje, co má která strana umět, aby spolu mohly komunikovat. Když si to převedeš do objektového světa, tak aby jeden objekt mohl komunikovat s druhým, musí vědět, jaké metody má ten druhý objekt dostupné.
Např. abys mohl komunikovat s databází, potřebuješ jí moci poslat nějaký dotaz:
interface Databaze {
function dotaz($sql);
}
Vytvoříš nějakou třídu, která interface implementuje:
class MySQLDatabaze implements Databaze {
function __construct($host, $uziv, $heslo, $db) {
$this->spojeni = mysql_connect($host, $uziv, $heslo);
mysql_select_db($db, $this->spojeni);
// ... atp.
}
function dotaz($sql) {
$vysledek = mysql_query($sql, $this->spojeni);
// ... zpracovaní výsledku dotazu
return $konecny_vysledek;
}
}
V kódu se pak odkazuješ pouze na tento interface (viz Type hinting[2]):
function vypisMenu(Databaze $db) {
$kategorie = $db->dotaz("select * from kategorie");
// ... zpracování výsledku dotazu
}
A když to zavoláš, PHP ověřuje, jestli předaný objekt implementuje rozhraní, které je vyžadováno:
$db = new MySQLDatabaze("localhost", "pepa", "heslo", "moje");
vypisMenu($db);
$nejaka_divnota = new stdClass;
vypisMenu($nejaka_divnota); // skončí chybou
Jednoduše řečeno jsou rozhraní způsobem, jak zajistit, že předávaný objekt bude rozumět tomu, co mu chceš říkat (jaké metody chceš volat).
Jaký mají význam abstraktní objekty a metody?
Abstraktní třídy stejně jako interfaces definují protokol, jímž se bude s objekty tohoto typu komunikovat. Ovšem implementace abstraktních metod je podmíněna tím, že objekty, které je implementují musí být potomkem (ať přímým, nebo nepřímým) dané abstraktní třídy.
PS. Mám v šuplíku jeden článek o OOP v PHP 5. Asi bych ho měl už konečně opravit a dát k konečné korektuře a vydání.
[1] http://en.wikipedia.org/wiki/Http
[2] http://php.net/manual/en/language.oop5.typehinting.php