Koncept objektově orientovaného programování (OOP) v PHP s příkladem
⚡ Chytré shrnutí
Objektově orientované programování v PHP modeluje aplikaci kolem reálných objektů pomocí tříd a objektů. Tento návod vysvětluje principy objektově orientovaného programování, jako je zapouzdření, dědičnost a polymorfismus, jak je PHP podporuje, a krok za krokem vytváří příklady pracovních tříd, dědičnosti a rozhraní.

Co je OOPs?
Objektově orientované programování je přístup k vývoji softwaru, který modeluje aplikaci kolem objektů reálného světa, jako jsou zaměstnanci, auta a bankovní účty. Třída definuje vlastnosti a metody objektu reálného světa. Objekt je instancí třídy.
Tři základní složky objektové orientace jsou:
- Objektově orientovaná analýza – funkčnost systému
- Objektově orientovaný návrh – architektura systému
- Objektově orientované programování – implementace aplikace
Principy objektově orientovaného programování
Tři hlavní principy OOP jsou:
- Zapouzdření – jde o skrytí detailů implementace a zveřejnění pouze metod. Hlavní účely zapouzdření jsou:
- Snižte složitost vývoje softwaru – skrytím implementačních detailů a odhalením pouze operací se používání třídy stává snadným.
- Chraňte vnitřní stav objektu – přístup k proměnným třídy je možný pomocí metod jako get a set. Díky tomu je třída flexibilní a snadno se udržuje.
- Umožněte změnu interní implementace třídy bez obav z narušení kódu, který třídu používá.
- Dědictví – týká se vztahu mezi třídami. Vztah má podobu rodiče a potomka. Potomek používá metody definované v rodičovské třídě. Hlavním účelem dědičnosti je:
- Znovupoužitelnost – od stejného rodiče může dědit více potomků. To je velmi užitečné, když musíme zajistit běžné funkce, jako je přidávání, aktualizace a mazání dat z databáze.
- Polymorfismus – jde o existenci jediného rozhraní s mnoha různými implementacemi. Hlavním účelem polymorfismu je:
- Zjednodušit údržbu aplikací a zvýšit jejich rozšiřitelnost.
OOP Concepts v PHP
PHP je objektově orientovaný skriptovací jazyk; podporuje všechny výše uvedené principy. Výše uvedených principů je dosaženo prostřednictvím:
- Zapouzdření – pomocí metod „get“ a „set“ a modifikátorů přístupu.
- Dědictví – pomocí klíčového slova extends
- Polymorfismus – pomocí klíčového slova implements
Nyní, když máme základní znalosti o OOP a o tom, jak je podporován PHP, podívejme se na příklady, které implementují výše uvedené principy.
Co je UML?
Unified Modeling Language (UML) je technika používaná k návrhu a dokumentaci objektově orientovaných systémů.
UML vytváří řadu dokumentů, ale my se podíváme na diagram tříd, který je velmi důležitý pro objektově orientované programování v PHP.
Příklad diagramu tříd
Klíč diagramu třídy
- Jedno horní krabice obsahuje název třídy
- Jedno střední krabice obsahuje proměnné třídy
- Jedno spodní schránka obsahuje metody třídy
- Jedno mínus (-) znaménko znamená soukromý rozsah
- Jedno více (+) znak znamená veřejný prostor
- Jedno hash (#) značka znamená chráněný rozsah
Jak vytvořit třídu v PHP
Klíčové slovo class se používá k definování třídy v PHP. Níže jsou uvedena pravidla pro vytvoření třídy v PHP.
- Název třídy by měl začínat písmenem
- Název třídy nemůže být vyhrazené slovo PHP
- Název třídy nesmí obsahovat mezery
Řekněme, že chceme vytvořit třídu pro reprezentaci zvířat. Začneme identifikací znaků, které jsou společné pro všechna zvířata.
- Všechna zvířata patří do nějaké čeledi, jako je býložravec, masožravec atd.
- Všechna zvířata jedí jídlo
Níže uvedený diagram znázorňuje třídní diagram pro dané zvíře.
Pojďme si nyní naprogramovat naši třídu Zvíře.
<?php class Animal { private $family; private $food; public function __construct($family, $food) { $this->family = $family; $this->food = $food; } public function get_family() { return $this->family; } public function set_family($family) { $this->family = $family; } public function get_food() { return $this->food; } public function set_food($food) { $this->food = $food; } } ?>
TADY,
- „private $family, $food“ znamená, že k proměnným nelze přistupovat přímo mimo třídu (zapouzdření).
- „public function __construct($family…)“ je metoda konstruktoru v PHP. Tato funkce se volá vždy, když je vytvořena instance třídy. V tomto případě nastavujeme family a food.
- „public function get…()“ je metoda používaná pro přístup k hodnotě rodiny nebo jídla (zapouzdření)
- „public function set…()“ je metoda používaná k nastavení hodnoty rodiny nebo jídla (zapouzdření)
Jak implementovat dědičnost v PHP
Budeme pracovat s krávou a lvem. Kráva i lev dědí ze třídy zvířat.
Níže uvedený diagram tříd ukazuje vztahy.
Všimněte si, že kráva dědí z třídy Animal a definuje si také vlastní proměnnou a metody.
Pojďme nyní naprogramovat třídu Cow.
<?php class Cow extends Animal { private $owner; public function __construct($family, $food) { parent::__construct($family, $food); } public function set_owner($owner) { $this->owner = $owner; } public function get_owner() { return $this->owner; } } ?>
Pojďme nyní naprogramovat třídu Lion.
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
TADY,
- „třída … rozšiřuje třídu Animal“ způsobí, že třídy Cow a Lion budou používat metody z třídy Animal (dědičnost).
Jak vytvořit objekt třídy
Třídy Animal, Cow a Lion by měly být kvůli jednoduchosti všechny ve stejném adresáři.
Nyní si vytvořme aplikaci, která bude používat naše třídy.
Příklad třídy PHP
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Carnivore', 'Meat'); echo '<b>Cow Object</b> <br>'; echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>'; echo '<b>Lion Object</b> <br>'; echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food(); ?>
Testování naší aplikace
Nyní si prohlédněme naši aplikaci ve webovém prohlížeči.
Oba objekty znovu používají metody get_family a get_food zděděné z třídy Animal, což demonstruje dědičnost v akci.
Jak implementovat polymorfismus v PHP
Řekněme, že chceme vyvinout aplikaci, která se připojuje k různým databázovým enginům, jako například MySQL a SQL Server, ale používá stejné jednotné rozhraní. Můžeme vytvořit rozhraní, které definuje standardní metody a abstract třída, která implementuje běžné metody.
- Rozhraní – je to podobné jako třída. Definuje pouze metody a parametry.
- Abstractřída T – je to třída, kterou nelze použít k přímému vytvoření objektu. Jeho účelem je poskytnout částečné nebo úplné implementace běžných metod.
Níže uvedený diagram tříd znázorňuje vztah mezi našimi břišními svaly.tractřída t, rozhraní a implementační třídy.
Pojďme si teď vypracovat břišní svalytractřída t.
<?php abstract class DBCommonMethods { private $host; private $db; private $uid; private $password; public function __construct($host, $db, $uid, $password) { $this->host = $host; $this->db = $db; $this->uid = $uid; $this->password = $password; } } ?>
TADY,
- břišní svalytrac„t class“ znamená, že třídu nelze přímo použít k vytvoření objektu
- „$host, $db…“ jsou proměnné třídy společné pro všechny implementace
- „function __construct(…)“ je metoda konstruktoru třídy, která nastavuje hodnoty společných proměnných při inicializaci
Nyní si vytvořme rozhraní, které bude obsahovat standardní metody, jež budou implementovány odlišně v závislosti na databázovém enginu.
<?php
interface DBInterface
{
public function db_connect();
public function insert($data);
public function read($where);
public function update($where);
public function delete($where);
}
?>
TADY,
- „rozhraní“ je klíčové slovo pro vytváření rozhraní
- „veřejná funkce…(…)“ jsou standardní metody, které by měly být implementovány
Nyní si vytvořme konkrétní třídy, které rozšíří třídu DBCommonMethods a implementují rozhraní DBInterface. Nejprve MySQLDriver.php:
<?php class MySQLDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
Pak, MSSQLServerDriver.php:
<?php class MSSQLServerDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
TADY,
- „třída … rozšiřuje DBCommonMethods“ používá metody v DBCommonMethods
- „… implements DBInterface“ zajišťuje, že třída poskytuje standardní metody bez ohledu na použitý ovladač databáze.
Kód používající výše uvedené třídy by vypadal takto:
<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>
nebo:
<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>
Zbytek kódu by byl pro oba ovladače stejný, například:
<?php $db->db_connect(); $db->insert($data); ?>
Toto je polymorfismus v akci: stejná volání metod fungují na jakémkoli ovladači, který implementuje dané rozhraní, takže okolní kód se při přepnutí databázového enginu nikdy nezmění.





