-
Co přináší OOP
-
Zapouzdření
- Uživatel se odstíní od vnitřního fungování prostřednictvím rozhraní.
- Dědění
-
Polymorfismus
- Schopnost OOP přeměnit chování nejaké třídy v závislosti na kontextu.
-
Pojmy
-
Třídy
- class nazev { }
-
Objekty
- Instance tříd, $objekt = new Trida();
-
Členské proměnné
- např. class Trida { private $atribut; }
- Atributy popisující charakteristiky třídy.
- Odkazy: $objekt->atribut (uvnitř třídy $this->atribut)
-
Obor členských proměnných
- public - lze k nim přistupovat přímo (např. $objekt->atribut = "neco";), nemělo by se používat
- private - dostupné pouze uvnitř třídy, ve které jsou definované, ani v instanci a ani v podtřídách, musí se k nim přistupovat přes veřejné rozhraní
- protected - určeny pouze pro interní potřebu třídy, dostupné pouze uvnitř tříd a v podtřídách
- final - není možné ji překrýt v odvozené třídě
-
Vlastnosti
- bohužel PHP 5 nenabízí "plně" vyhovující funkcionalitu, ale má něco co připomíná podporu vlastností
- jde o přetěžování metod __set a __get (deklarujíc se jako metoda v třídě), které se volají, když se pokusíme odkázat na neexistující členskou proměnnou
- využívají se k výpisu chybové zprávy nebo dokonce k rozšíření třídy za pochodu vytvářením nových proměnných
-
__set(promenna, hodnota)
- mutátor (setter), skrývá implementaci a ověřuje data dříve, než se přiřadí
- může rozšířit třídu o nové vlastnosti
-
__get(promenna)
- accessor (getter), když chceme získat hodnotu proměnné z třídy
- nejsou však postačující pro složitější objektové aplikace, v tom případě je na místě vytvořit pro každou privátní členskou proměnnou dvě veřejné metody napr. getJmeno(), setJmeno()
-
Konstanty
- definují se uvnitř třídy, nezmění se po celou dobu života objektu vytvořeného z dané třídy (např. dobré pro PI)
- const NAZEV = 'neco';
- volá se echo trida::KONSTANTA;
-
Metody
- Obdobné jako funkce, definují chování v nějaké konkrétní třídě.
- volají se $objekt->metoda();
- deklarace - obor function nazev() { ... }
- pokud se neuvede obor, implicitně se bere public
-
Obory metod
- public - jsou přístupné odkudkoliv
- private - pouze pro interní potřebu původní třídy, nemohou je volat instance objektů ani původní, ani odvozených tříd, všechny metody určené jako pomůcky pro jiné metody mají být private
- protected - dostupné pouze v původní třídě a v jejich podtřídách, mají sloužit jako pomůcky při interních výpočtech v původní třídě nebo v jejich podtřídách
-
abstract
- deklarují se jen v rodičovské třídě, ale implementují v dceřiných
- abstraktní metody mohou obsahovat pouze abstraktní třídy, používá se pro inavrhování API, které se později použije jako implementační model
- abstract function nazev();, z dané abstraktní třídy se pak odvozují konkrétnější třídy
- final - zabrání tomu, aby se mohla metoda překrývat v podtřídách
-
Type hinting (rada pro typ)
- zajišťuje, že objekt, který se předává do metody, bude opravdu členem správné třídy
- private function nazev(trida $objekt);
- funguje pouze pro objekty
-
Konstruktory
- Kód, který se vykonává automaticky v době, kdy se vytváří instance objektu.
- Může přijímat parametry, které se v době vytváření instance přiřadí konkrétním členským proměnným objektu.
- Může volat metody třídy a jiné fce.
- Může volat jiné konstruktory včetně konstruktorů z rodičovské třídy.
- function __construct (...) { }
- PHP automaticky nevolá konstruktor rodičovské třídy, dělá se to explicitně pomocí parent::__construct() c konstruktoru odvozené třídy.
- Můžeme volat i nespřízněný konstruktor pomocí trida::_construct();
-
Destruktory
- function __destruct();
- Když skript skončí, PHP zničí všechny objekty sídlící v paměti. Takže v tomto případě explicitní deklarování konstruktoru zbytečné.
- Využijeme, když chceme například se zánikem objektu vymazat nějaká data z databáze nebo ze souboru apod.
-
Statické členy tříd
- Členské proměnné a metody, které nebude volat žádný konkrétní objekt, ale budou patřit do všech instancí a všechny instance je budou sdílet.
- Dobré např. když děláme třídu pro počítání návstěvníků stránky a počítáme jejich počet a nechceme, aby se tento počet vrátil na nulu pokaždé, když se vytvoří instance třídy.
- private static $Nazev_tridy = neco;
- Na statické členské proměnné a metody se odkazuje klíčovým slovem self a názvem třídy.
- self::$Nazev;
-
instanceof
- Zjišťuje, zda je nějaký objekt intancí dané třídy, podtřídou třídy nebo implemeentuje-li konkrétní rozhraní.
- if ($osoba instanceof Clovek) echo "OK";
- Jestliže se porovnání nezdaří, vykonávání skriptu skončí.
- Vhodné, pokud voláme opakovaně nějakou konkrétní fci ale chceme její chování došít na míru podle typu objektu.
-
Pomocné funkce
- class_exists(trida);
-
get_class(objekt);
- vrátí název třídy do které patří objekt
-
get_class_methods(trida);
- vrátí pole obsahující názvy všech metod
-
get_class_vars(trida);
- vrátí asociativní pole názvů všech členských proměnných
-
get_declared_classes();
- vrátí pole obsahující názvy všech tříd definovaných uvnitř aktuálně vykonávaného skriptu
-
get_object_vars(object);
- vrátí asociativní pole členských proměnných a jejich hodnot, které jsou dostupné pro objekt, ty které nemají přidělenou žádnou hodnotu, v poli bude NULL
-
get_parent_class(objekt);
- vrátí název rodičovské třídy té třídy, kam objekt patří, je-li objekt řetězec, předpokládá se, že je to název třídy a vrátí se název rodičovské třídy této třídy
-
is_a(objekt, trida);
- vrátí TRUE jestliže objekt patří do třídy nebo do nějaké třídy, která je z ní odvozená
-
is_subclass_of(objekt, trida);
- vrátí TRUE jestliže je objekt patří do třídy odvozené z třídy
-
method_exists(objekt, metoda);
- vrátí TRUE jestliže je metoda dostupná objektu
-
Automatické načítání objektů
- funkcí __autoload() se zbavíme nutnosti vkládat příkazy require_once() apod.
- když se nějaké třída zavolá poprvé, zavolá se __autoload() a načte třídu podle příkazů v této fci
- umístit ji do nějakého globálního konfiguračního souboru
- function __autoload($trida) { require_once("tridy/$trida.class.php"); }