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í.

  • 🧱 Třídy a objekty: Třída definuje vlastnosti a metody reálné věci a objekt je jedinou instancí této třídy.
  • 🔒 Zapouzdření: Soukromé proměnné s veřejnými metodami get a set skrývají interní detaily a chrání stav objektu.
  • 👪 Dědictví: Klíčové slovo extends umožňuje podřízené třídě znovu použít metody nadřazené třídy, čímž se snižuje duplicitní kód.
  • 🔁 Polymorfismus: Rozhraní definuje standardní metody, které mnoho tříd implementuje odlišně za jedním jednotným konceptem.tract.
  • 📐 Diagram tříd UML: Diagram tříd zobrazuje název třídy, proměnné a metody, přičemž plus, mínus a hash označují veřejný, soukromý a chráněný rozsah.
  • 🧩 Rozhraní a abstract: Břišní svalytracTřída t sdílí společný kód, zatímco rozhraní zaručuje, že každá třída ovladače poskytuje stejné metody.
  • 🤖 AI Assist: Nástroje umělé inteligence dokáží vygenerovat PHP třídu z popisu a refaktorovat procedurální kód do čistého objektově orientovaného kódu.

Objektově orientované programování v PHP

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

OOP Concepts v PHP

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.

Vytvořte třídu v PHP

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.

implementovat dědičnost v PHP

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.

Dědičnost v PHP

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.

Dědičnost v PHP

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í.

Nejčastější dotazy

Břišní svalytracTřída t může obsahovat implementované metody i vlastnosti a třída rozšiřuje pouze jednu z nich. Rozhraní deklaruje pouze signatury metod a třída jich může implementovat mnoho. Použijte abstractřída t pro sdílení kódu, rozhraní pro vynucení contract.

Čtyři pilíře jsou zapouzdření, dědičnost, polymorfismus a abstracce. Tento tutoriál se zaměřuje na první tři; břišní svalytracce skrývá složité detaily za jednoduchým rozhraním, které PHP podporuje pomocí abstract třídy a rozhraní.

Veřejné členy lze dosáhnout kdekoli, soukromé členy pouze uvnitř stejné třídy a chráněné členy uvnitř třídy a jejích podtříd. Vynucují zapouzdření tím, že řídí, kdo může číst nebo měnit každou vlastnost nebo metodu.

Ano. Dejte umělé inteligenci pole nebo definici tabulky a dokáže vytvořit třídu s typovanými vlastnostmi, konstruktorem a metodami get a set. RevPřed použitím třídy si prohlédněte typy a přidejte validaci.

Ano. Vložte procedurální skript a umělá inteligence může seskupit související funkce a data do tříd, použít zapouzdření a navrhnout dědičnost nebo rozhraní. Otestujte refaktorovaný kód, protože chování by mělo zůstat stejné.

Shrňte tento příspěvek takto: