Samouczek dotyczący koncepcji programowania obiektowego PHP (OOP) z przykładem
Co to jest OOP?
Zorientowane obiektowo to podejście do tworzenia oprogramowania, które modeluje aplikację wokół obiektów świata rzeczywistego, takich jak pracownicy, samochody, konta bankowe itp. Klasa definiuje właściwości i metody obiektu świata rzeczywistego. Obiekt jest wystąpieniem klasy.
Trzy podstawowe elementy orientacji obiektowej to:
- Analiza obiektowa – funkcjonalność systemu
- Projektowanie obiektowe – architektura systemu
- Programowanie obiektowe – implementacja aplikacji
Zasady programowania obiektowego
Trzy główne zasady OOP to:
- Kapsułkowanie – dotyczy to ukrycia szczegółów implementacji i ujawnienia tylko metod. Głównym celem enkapsulacji jest:
- 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ń wewnętrzny stan obiektu – dostęp do zmiennych klasy odbywa się za pomocą metod takich jak get i set, dzięki czemu klasa jest elastyczna i łatwa w utrzymaniu.
- Wewnętrzną implementację klasy można zmienić bez obawy o uszkodzenie kodu korzystającego z klasy.
- Dziedzictwo – dotyczy to relacji pomiędzy klasami. Relacja przybiera formę rodzica i dziecka. Dziecko korzysta z metod zdefiniowanych w klasie nadrzędnej. Głównym celem dziedziczenia jest;
- Ponowne wykorzystanie – liczba dzieci, może dziedziczyć od tego samego rodzica. Jest to bardzo przydatne, gdy musimy zapewnić wspólną funkcjonalność, taką jak dodawanie, aktualizacja i usuwanie danych z bazy danych.
- Wielopostaciowość – dotyczy to posiadania jednej formy, ale wielu różnych sposobów realizacji. Głównym celem polimorfizmu jest;
- Uprość utrzymanie aplikacji i zwiększ ich możliwości rozbudowy.
OOP Concepts w PHP
PHP jest obiektowym językiem skryptowym; obsługuje wszystkie powyższe zasady. Powyższe zasady osiąga się poprzez;
- Kapsułkowanie – poprzez zastosowanie metod „get”, „set” itp.
- Dziedzictwo – poprzez użycie słowa kluczowego Extends
- Wielopostaciowość – poprzez użycie słowa kluczowego implements
Teraz, gdy mamy podstawową wiedzę na temat OOP i tego, w jaki sposób jest on obsługiwany PHP, spójrzmy na przykłady realizujące powyższe zasady
Co to jest UML?
Unified Modeling Language UML to technika używana do projektowania i dokumentowania systemów obiektowych.
UML tworzy wiele dokumentów, ale przyjrzymy się diagramowi klas, który jest bardzo ważny w programowaniu obiektowym w PHP.
Przykład diagramu klas
Klucz diagramu klas
- Kurs Górne pudełko zawiera nazwę klasy
- Kurs środkowe pole zawiera zmienne klasy
- Kurs dolne pole zawiera metody klasy
- Kurs minus (-) znak oznacza zakres prywatny
- Kurs więcej (+) znak oznacza zakres publiczny
- Kurs 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
Powiedzmy, że chcemy stworzyć klasę reprezentującą zwierzęta.
Zaczniemy od zidentyfikowania cech wspólnych dla wszystkich zwierząt.
- Wszystkie zwierzęta należą do rodziny takiej jak roślinożerca, karnawał itp.
- Wszystkie zwierzęta jedzą jedzenie
Poniższy diagram przedstawia schemat zwierzęcia
Zakodujmy teraz naszą klasę zwierząt
<?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,
- „private $family, $food” oznacza, że do zmiennych nie można uzyskać dostępu bezpośrednio poza klasą (Enkapsulacja).
- „funkcja publiczna __construct($family…)” to metoda konstruktora php. Ta funkcja jest wywoływana za każdym razem, gdy tworzona jest instancja klasy. W tym przypadku ustalamy rodzinę i jedzenie.
- „funkcja publiczna get…()” to metoda używana do uzyskania dostępu do wartości rodziny lub żywności (hermetyzacja)
- „zestaw funkcji publicznych…()” to metoda stosowana do ustawiania wartości rodziny lub żywności (hermetyzacja)
Jak zaimplementować 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 zwierząt i definiuje własną zmienną oraz 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; } } ?>
Zakodujmy teraz klasę Lion
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
TUTAJ,
- „klasa… rozszerza Animal” powoduje, że krowa i lew korzystają z metod z klasy Animal (Dziedziczenie).
Jak utworzyć obiekt klasy
Dla uproszczenia klasy Animal, Cow i Lion powinny znajdować się w tym samym katalogu.
Stwórzmy teraz aplikację korzystającą z naszych klas.
Przykład klasy PHP
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Canirval', '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
Przyjrzyjmy się teraz naszej aplikacji w przeglądarce internetowej
Fantastycznie, prawda! Przyjrzyjmy się teraz trzeciej zasadzie OOP, polimorfizmowi.
Załóżmy, że chcemy opracować aplikację, która łączy się z różnymi silnikami baz danych, takimi jak MySQL i SQL Serwer, ale korzystaj z tego samego jednolitego interfejsu.
Możemy stworzyć interfejs definiujący metody standardowe oraz klasę abstrakcyjną implementującą typowe metody.
- Interfejs – przypomina klasę. Definiuje jedynie metody i parametry.
- Klasa abstrakcyjna – 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 relacje między klasą abstrakcyjną, klasą interfejsu i klasą implementacji.
Stwórzmy teraz naszą klasę abstrakcyjną
<?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,
- „klasa abstrakcyjna” oznacza, że klasy nie można użyć bezpośrednio do utworzenia obiektu w PHP
- „$host, $db…” to zmienne klasowe wspólne dla wszystkich implementacji
- „funkcja __construct(…)” to metoda konstruktora klasy php, która ustawia wartości wspólnych zmiennych podczas inicjalizacji
Stwó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 będą rozszerzać klasę DBCommonMethods i rozszerzać interfejs DBInterface. 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 } } ?>
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 zestawu DBCommonMethods
- „…implementuje DBInterface” zapewnia, że klasa udostępnia standardowe metody niezależnie od użytego sterownika bazy danych.
Użycie powyższego kodu Kod wykorzystujący powyższą klasę będzie wyglądał następująco
<?php $db = new MySQLDriver($host,$db,$uid,$password); ?>
Or
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
Reszta kodu będzie taka sama dla obu sterowników, np.;
<?php $db->db_connect(); $db->insert($data); ?>
Podsumowanie
- Programowanie obiektowe OOP to potężna technika, która modeluje aplikacje na podstawie obiektów ze świata rzeczywistego
- Klasa jest reprezentacją obiektów świata rzeczywistego wraz z właściwościami i metodami
- Trzy podstawowe zasady OOP to:
- Kapsułkowanie
- Dziedzictwo
- Wielopostaciowość