Koncepcja programowania obiektowego PHP (OOP) z przykładem
⚡ Inteligentne podsumowanie
Programowanie obiektowe w PHP modeluje aplikację wokół obiektów świata rzeczywistego za pomocą klas i obiektów. Ten przewodnik wyjaśnia zasady enkapsulacji, dziedziczenia i polimorfizmu w programowaniu obiektowym (OPP), sposób ich obsługi oraz krok po kroku tworzy przykłady klasy roboczej, dziedziczenia i interfejsu.

Co to jest OOP?
Programowanie obiektowe to podejście do tworzenia oprogramowania, które modeluje aplikację wokół obiektów ze świata rzeczywistego, takich jak pracownicy, samochody i konta bankowe. Klasa definiuje właściwości i metody obiektu ze świata rzeczywistego. Obiekt jest instancją klasy.
Trzy podstawowe składniki orientacji obiektowej to:
- Analiza obiektowa – funkcjonalność systemu
- Projektowanie obiektowe – architektura systemu
- Programowanie obiektowe – implementacja aplikacji
Zasady programowania obiektowego
Trzy główne zasady programowania obiektowego to:
- Kapsułkowanie – chodzi o ukrycie szczegółów implementacji i ujawnienie jedynie metod. Głównymi celami enkapsulacji są:
- Zmniejsz złożoność tworzenia oprogramowania – ukrywając szczegóły implementacji i udostępniając wyłącznie operacje, korzystanie z klasy staje się łatwe.
- Chroń stan wewnętrzny obiektu – dostęp do zmiennych klasy odbywa się za pomocą metod takich jak get i set. Dzięki temu klasa jest elastyczna i łatwa w utrzymaniu.
- Umożliwia zmianę wewnętrznej implementacji klasy bez obawy o uszkodzenie kodu korzystającego z tej klasy.
- Dziedzictwo – dotyczy relacji między klasami. Relacja ta przyjmuje formę rodzica i dziecka. Dziecko korzysta z metod zdefiniowanych w klasie nadrzędnej. Głównym celem dziedziczenia jest:
- Wielokrotność – wiele elementów potomnych może dziedziczyć po tym samym rodzicu. Jest to bardzo przydatne, gdy musimy zapewnić wspólną funkcjonalność, taką jak dodawanie, aktualizowanie i usuwanie danych z bazy danych.
- Wielopostaciowość – chodzi o posiadanie jednego interfejsu z wieloma różnymi implementacjami. Głównym celem polimorfizmu jest:
- Aby uprościć konserwację aplikacji i zwiększyć ich rozszerzalność.
OOP Concepts w PHP
PHP to obiektowy język skryptowy, który wspiera wszystkie powyższe zasady. Powyższe zasady są realizowane poprzez:
- Kapsułkowanie – poprzez użycie metod „get” i „set” oraz modyfikatorów dostępu.
- Dziedzictwo – poprzez użycie słowa kluczowego extends
- Wielopostaciowość – poprzez użycie słowa kluczowego „narzędzia”
Teraz, gdy mamy podstawową wiedzę na temat OOP i tego, w jaki sposób jest on obsługiwany PHP, przyjrzyjmy się przykładom wdrażającym powyższe zasady.
Co to jest UML?
Unified Modeling Language (UML) to technika służąca do projektowania i dokumentowania systemów zorientowanych obiektowo.
UML generuje pewną liczbę dokumentów, ale my skupimy się na diagramie klas, który jest bardzo ważny w programowaniu obiektowym PHP.
Przykład diagramu klas
Klucz diagramu klas
- górne pole zawiera nazwę klasy
- środkowe pole zawiera zmienne klasy
- dolne pole zawiera metody klasy
- minus (-) znak oznacza zakres prywatny
- więcej (+) znak oznacza zakres publiczny
- skrót (#) znak oznacza obszar chroniony
Jak utworzyć klasę w PHP
Słowo kluczowe class służy do definiowania klasy w PHP. Poniżej znajdują się zasady tworzenia klasy w PHP.
- Nazwa klasy powinna zaczynać się od litery
- Nazwa klasy nie może być słowem zastrzeżonym PHP
- Nazwa klasy nie może zawierać spacji
Załóżmy, że chcemy utworzyć klasę reprezentującą zwierzęta. Zaczniemy od zidentyfikowania cech wspólnych dla wszystkich zwierząt.
- Wszystkie zwierzęta należą do rodziny roślinożerców, mięsożerców itp.
- Wszystkie zwierzęta jedzą jedzenie
Poniższy diagram przedstawia diagram klasowy zwierzęcia.
Zaprogramujmy teraz naszą klasę Animal.
<?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; } } ?>
TUTAJ,
- „prywatne $family, $food” oznacza, że do zmiennych nie można uzyskać bezpośredniego dostępu spoza klasy (hermetyzacja).
- „public function __construct($family…)” to metoda konstruktora PHP. Ta funkcja jest wywoływana za każdym razem, gdy tworzona jest instancja klasy. W tym przypadku ustawiamy rodzinę i jedzenie.
- „public function get…()” to metoda używana do uzyskiwania dostępu do wartości rodziny lub żywności (enkapsulacja)
- „public function set…()” to metoda używana do ustawiania wartości rodziny lub żywności (enkapsulacja)
Jak wdrożyć dziedziczenie w PHP
Będziemy pracować z krową i lwem. Zarówno krowa, jak i lew dziedziczą z klasy Animal.
Poniższy diagram klas pokazuje zależności.
Należy zauważyć, że krowa dziedziczy po klasie Animal i definiuje własne zmienne i metody.
Zakodujmy teraz klasę 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; } } ?>
Zaprogramujmy teraz klasę Lion.
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
TUTAJ,
- „class … extends Animal” sprawia, że klasy Cow i Lion używają metod z klasy Animal (dziedziczenie).
Jak utworzyć obiekt klasy
Dla uproszczenia klasy Animal, Cow i Lion powinny znajdować się w tym samym katalogu.
Utwórzmy teraz aplikację wykorzystującą nasze klasy.
Przykład klasy 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(); ?>
Testowanie naszej aplikacji
Obejrzyjmy teraz naszą aplikację w przeglądarce internetowej.
Oba obiekty wykorzystują metody get_family i get_food odziedziczone po klasie Animal, co demonstruje dziedziczenie w działaniu.
Jak zaimplementować polimorfizm w PHP
Załóżmy, że chcemy opracować aplikację łączącą się z różnymi silnikami baz danych, takimi jak: MySQL oraz SQL Serwer, ale korzysta z tego samego, ujednoliconego interfejsu. Możemy utworzyć interfejs definiujący standardowe metody i interfejs abs.tracKlasa t implementująca metody wspólne.
- Interfejs – przypomina klasę. Definiuje jedynie metody i parametry.
- Abstracklasa T – jest to klasa, za pomocą której nie można bezpośrednio utworzyć obiektu. Jego celem jest zapewnienie częściowych lub całościowych implementacji typowych metod.
Poniższy diagram klas ilustruje związek między naszymi mięśniami brzuchatracKlasa t, interfejs i klasy implementacji.
Stwórzmy teraz nasze mięśnie brzuchatracklasa 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; } } ?>
TUTAJ,
- „brzuch”trac„klasa t” oznacza, że klasy nie można użyć bezpośrednio do utworzenia obiektu
- „$host, $db…” to zmienne klasowe wspólne dla wszystkich implementacji
- „funkcja __construct(…)” to metoda konstruktora klasy, która ustawia wartości wspólnych zmiennych podczas inicjalizacji
Utwórzmy teraz interfejs zawierający standardowe metody, które będą implementowane w różny sposób w zależności od silnika bazy danych.
<?php
interface DBInterface
{
public function db_connect();
public function insert($data);
public function read($where);
public function update($where);
public function delete($where);
}
?>
TUTAJ,
- „interfejs” to słowo kluczowe służące do tworzenia interfejsów
- „funkcja publiczna…(…)” to standardowe metody, które należy wdrożyć
Utwórzmy teraz konkretne klasy, które rozszerzą klasę DBCommonMethods i zaimplementują interfejs DBInterface. Najpierw MySQLSterownik.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 */ } } ?>
Następnie 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 */ } } ?>
TUTAJ,
- „klasa … rozszerza DBCommonMethods” używa metod z DBCommonMethods
- „… implementuje DBInterface” zapewnia, że klasa udostępnia standardowe metody niezależnie od używanego sterownika bazy danych.
Kod wykorzystujący powyższe klasy wyglądałby następująco:
<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>
Lub:
<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>
Reszta kodu będzie taka sama dla obu sterowników, na przykład:
<?php $db->db_connect(); $db->insert($data); ?>
Oto polimorfizm w działaniu: ta sama metoda wywołuje pracę dla każdego sterownika implementującego interfejs, więc otaczający kod nigdy się nie zmienia, gdy zmieniasz silniki bazy danych.





