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.

  • 🧱 Klasy i obiekty: Klasa definiuje właściwości i metody obiektu ze świata realnego, a obiekt jest pojedynczym wystąpieniem tej klasy.
  • 🔒 Kapsułkowanie: Prywatne zmienne z publicznymi metodami get i set ukrywają szczegóły wewnętrzne i chronią stan obiektu.
  • 👪 Dziedzictwo: Słowo kluczowe extends pozwala klasie potomnej na ponowne wykorzystanie metod klasy nadrzędnej, redukując liczbę duplikatów kodu.
  • 🔁 Wielopostaciowość: Interfejs definiuje standardowe metody, które wiele klas implementuje w różny sposób za pomocą jednego, ujednoliconego interfejsu.tract.
  • 📐 Diagram klas UML: Diagram klas pokazuje nazwę klasy, zmienne i metody, a także znaki plus, minus i hash oznaczające zakres publiczny, prywatny i chroniony.
  • 🧩 Interfejsy i ABStract: Mięśnie brzuchatracKlasa t współdzieli wspólny kod, podczas gdy interfejs gwarantuje, że każda klasa sterownika udostępnia te same metody.
  • 🤖 Asystent AI: Narzędzia AI potrafią generować klasy PHP z opisu i przekształcać kod proceduralny w czysty kod obiektowy.

Programowanie obiektowe PHP

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

OOP Concepts w PHP

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.

Utwórz klasę w PHP

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.

zaimplementuj dziedziczenie w PHP

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.

Dziedziczenie w PHP

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.

Dziedziczenie w PHP

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.

FAQ

Mięśnie brzuchatracKlasa t może zawierać zarówno zaimplementowane metody, jak i właściwości, a klasa rozszerza tylko jedną. Interfejs deklaruje tylko sygnatury metod, a klasa może implementować wiele. Użyj abs.tracklasa t do udostępniania kodu, interfejs do egzekwowaniatract.

Cztery filary to: enkapsulacja, dziedziczenie, polimorfizm i abstraccja. Ten samouczek skupia się na pierwszych trzech: mięśniach brzuchatraccja ukrywa złożone szczegóły za prostym interfejsem, który PHP obsługuje z abstracklasy i interfejsy t.

Elementy publiczne są dostępne z dowolnego miejsca, elementy prywatne tylko w obrębie tej samej klasy, a elementy chronione – w obrębie klasy i jej podklas. Wymuszają one hermetyzację, kontrolując, kto może odczytywać lub zmieniać każdą właściwość lub metodę.

Tak. Podaj AI pola lub definicję tabeli, a ona wygeneruje klasę z właściwościami typizowanymi, konstruktorem oraz metodami get i set. Revsprawdź typy i dodaj walidację przed użyciem klasy.

Tak. Wklej skrypt proceduralny, a AI może grupować powiązane funkcje i dane w klasy, stosować hermetyzację i sugerować dziedziczenie lub interfejsy. Przetestuj zrefaktoryzowany kod, ponieważ jego zachowanie powinno pozostać identyczne.

Podsumuj ten post następująco: