PHP OOP: Zapouzdření, dědičnost, polymorfismus, abstrakce [4]
Objektově orientované programování (OOP) stojí na čtyřech základních pilířích a to jsou - zapouzdření, dědičnost, polymorfismus a abstrakce (Abstraction). Nesmíme ale také zapomenout na kompozici (Composition) a delegování (Delegation).
Zapouzdření
Zapouzdření (Encapsulation) znamená skrytí (izolování) některých atribudů a metod (nastavení že jsou privátní - private), čímž se zamezí jich přímému volání/změnám zvenku (mimo třídu).
Pomocí interface (rozhraní) pak můžeme definovat jen veřejné metody, které se mají skutečně používat při práci s třídou a ostatní metody zůstanou skryty (ty které se používají jen pro vnitřní potřebu třídy).
Dědičnost
Dědičnost (Inheritance) se používá k:
- rozšiřování existujících tříd pomocí slova extends (nová třída vzniklá na základě staré)
- vhodné když nová třída má stejné vlastnosti jako již existující třída a zároveň od ní chceme něco navíc
- sdílení metod či atributů mezi potomkem a předkem je možné pomocí modifikátoru protected
- pokud chceme upravit konstruktor u potomka a využít i kontstuktor předka, tak použijeme parent::__construct()
Typickým příkladem dědění ve frameworku Nette je použití BasePresenteru od kterého pak dědí všechny ostatní presentery v daném modulu.
Abstrakce
Abstrakce v OOP znamená:
- zjednodušený pohled na složité věci
- zahrnutí jen podstatných (obecných) věcí s vynecháním zbytečných detailů
- pomocí abstrakce je možné využívat kód univerzálněji a tím pádem k více účelům
Polymorfismus
Polymorfismus (Polymorphism) v bodech:
- umožňuje použít shodnou metodu mezi třídami, ale každá třída může mít různou definici této metody
- k implementaci polymorfismu mezi třídami můžeme ideálně použít rozhraní (interface) a abstraktní třídy (abstract class)
Příklad polymorfismu na githubu
class Parent1 {
public function speak()
{
echo 'Parent1' . PHP_EOL;
}
}
class Child1 extends Parent1 {
public function speak()
{
echo 'Child1' . PHP_EOL;
}
}
class Parent2 {
public function speak()
{
echo 'Parent2' . PHP_EOL;
}
}
/**
* example 1
*/
(new Parent1())->speak();
(new Child1())->speak();
(new Parent2())->speak();
/**
* example 2
*/
$arr = [];
$arr[] = new Parent1();
$arr[] = new Child1();
$arr[] = new Parent2();
foreach ($arr as $a)
{
$a->speak();
}