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"); }
More Maps From User
Copy the code to embed this map into your article. The embeded map can even be zoomed in / out