Koncept objektno orijentiranog programiranja (OOP) u PHP-u s primjerom

โšก Pametni saลพetak

Objektno orijentirano programiranje u PHP-u modelira aplikaciju oko objekata iz stvarnog svijeta koristeฤ‡i klase i objekte. Ovaj vodiฤ objaลกnjava OOP principe enkapsulacije, nasljeฤ‘ivanja i polimorfizma, kako ih PHP podrลพava te korak po korak gradi primjere radnih klasa, nasljeฤ‘ivanja i suฤelja.

  • ๐Ÿงฑ Klase i objekti: Klasa definira svojstva i metode stvari iz stvarnog svijeta, a objekt je jedna instanca te klase.
  • ๐Ÿ”’ ovijanje: Privatne varijable s javnim metodama get i set skrivaju interne detalje i ลกtite stanje objekta.
  • ๐Ÿ‘ช nasljedstvo: Kljuฤna rijeฤ extends omoguฤ‡uje podreฤ‘enoj klasi ponovnu upotrebu metoda roditeljske klase, smanjujuฤ‡i duplicirani kod.
  • ๐Ÿ” polimorfizam: Suฤelje definira standardne metode koje mnoge klase implementiraju razliฤito iza jedne uniformne konotacije.tract.
  • ๐Ÿ“ UML dijagram klase: Dijagram klase prikazuje naziv klase, varijable i metode, s plusom, minusom i hashom koji oznaฤavaju javni, privatni i zaลกtiฤ‡eni opseg.
  • ๐Ÿงฉ Suฤelja i Abstract: TrbuลกnjacitracKlasa t dijeli zajedniฤki kod, dok suฤelje jamฤi da svaka klasa upravljaฤkog programa pruลพa iste metode.
  • ๐Ÿค– AI pomoฤ‡: AI alati mogu generirati PHP klasu iz opisa i refaktorirati proceduralni kod u ฤist objektno orijentirani kod.

Objektno orijentirano programiranje u PHP-u

ล to je OOPs?

Objektno orijentirano programiranje je pristup razvoju softvera koji modelira aplikaciju oko objekata iz stvarnog svijeta kao ลกto su zaposlenici, automobili i bankovni raฤuni. Klasa definira svojstva i metode objekta iz stvarnog svijeta. Objekt je instanca klase.

Tri osnovne komponente orijentacije na objekt su:

  • Objektno orijentirana analiza โ€“ funkcionalnost sustava
  • Objektno orijentirani dizajn โ€“ arhitektura sustava
  • Objektno orijentirano programiranje โ€“ implementacija aplikacije

Naฤela objektno orijentiranog programiranja

Tri glavna principa OOP-a su:

  • ovijanje โ€“ ovo se odnosi na skrivanje detalja implementacije i otkrivanje samo metoda. Glavne svrhe enkapsulacije su:
    • Smanjite sloลพenost razvoja softvera โ€“ skrivanjem detalja implementacije i izlaganjem samo operacija, koriลกtenje klase postaje jednostavno.
    • Zaลกtitite unutarnje stanje objekta โ€“ pristup varijablama klase ostvaruje se putem metoda kao ลกto su get i set. To klasu ฤini fleksibilnom i jednostavnom za odrลพavanje.
    • Omoguฤ‡ite promjenu interne implementacije klase bez brige o oลกteฤ‡enju koda koji koristi klasu.
  • Nasljeฤ‘ivanje โ€“ ovo se odnosi na odnos izmeฤ‘u klasa. Odnos poprima oblik roditelja i djeteta. Dijete koristi metode definirane u roditeljskoj klasi. Glavna svrha nasljeฤ‘ivanja je:
    • Ponovna upotrebljivost โ€“ viลกe djece moลพe nasljeฤ‘ivati โ€‹โ€‹od istog roditelja. To je vrlo korisno kada moramo osigurati uobiฤajene funkcionalnosti poput dodavanja, aลพuriranja i brisanja podataka iz baze podataka.
  • polimorfizam โ€“ ovo se odnosi na postojanje jednog suฤelja s mnogo razliฤitih implementacija. Glavna svrha polimorfizma je:
    • Kako bi se pojednostavilo odrลพavanje aplikacija i uฤinilo ih proลกirivima.

OOP-ovi Concepts u PHP-u

PHP je objektno orijentirani skriptni jezik; podrลพava sve gore navedene principe. Gore navedeni principi se postiลพu putem:

  • ovijanje โ€“ koriลกtenjem metoda โ€žgetโ€œ i โ€žsetโ€œ te modifikatora pristupa.
  • Nasljeฤ‘ivanje โ€“ putem koriลกtenja kljuฤne rijeฤi extends
  • polimorfizam โ€“ putem koriลกtenja kljuฤne rijeฤi implements

Sada kada imamo osnovno znanje o OOP-u i kako je on podrลพan u PHP, pogledajmo primjere koji primjenjuju gore navedena naฤela.

ล to je UML?

Unified Modeling Language (UML) je tehnika koja se koristi za dizajn i dokumentiranje objektno orijentiranih sustava.

UML stvara brojne dokumente, ali mi ฤ‡emo se osvrnuti na dijagram klasa, koji je vrlo vaลพan za objektno orijentirano PHP programiranje.

Primjer dijagrama klasa

OOP-ovi Concepts u PHP-u

Kljuฤ dijagrama klasa

  • The gornji okvir sadrลพi naziv klase
  • The srednja kutija sadrลพi varijable klase
  • The donja kutija sadrลพi metode klase
  • The minus (-) znak znaฤi privatni opseg
  • The viลกe (+) znak znaฤi javni opseg
  • The hash (#) znak znaฤi zaลกtiฤ‡eni opseg

Kako stvoriti klasu u PHP-u

Kljuฤna rijeฤ class koristi se za definiranje klase u PHP-u. Ispod su pravila za stvaranje klase u PHP-u.

  • Ime klase treba zapoฤeti slovom
  • Naziv klase ne moลพe biti PHP rezervirana rijeฤ
  • Naziv klase ne smije sadrลพavati razmake

Recimo da ลพelimo stvoriti klasu za predstavljanje ลพivotinja. Poฤet ฤ‡emo s identificiranjem znaฤajki koje su zajedniฤke svim ลพivotinjama.

  • Sve ลพivotinje pripadaju nekoj porodici kao ลกto su biljojedi, mesojedi itd.
  • Sve ลพivotinje jedu hranu

Donji dijagram prikazuje dijagram klase za ลพivotinju.

Napravite klasu u PHP-u

Sada kodirajmo naลกu klasu ลฝivotinja.

<?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;
    }
}
?>

OVDJE,

  • โ€žprivatna $family, $foodโ€œ znaฤi da se varijablama ne moลพe pristupiti izravno izvan klase (enkapsulacija).
  • โ€žpublic function __construct($familyโ€ฆ)โ€œ je PHP metoda konstruktora. Ova funkcija se poziva svaki put kada se stvori instanca klase. U ovom sluฤaju postavljamo obitelj i hranu.
  • โ€žjavna funkcija getโ€ฆ()โ€œ je metoda koja se koristi za pristup vrijednosti obitelji ili hrane (enkapsulacija)
  • โ€žjavna funkcija setโ€ฆ()โ€œ je metoda koja se koristi za postavljanje vrijednosti obitelji ili hrane (enkapsulacija)

Kako implementirati nasljeฤ‘ivanje u PHP-u

Radit ฤ‡emo s kravom i lavom. I krava i lav nasljeฤ‘uju iz klase ลพivotinja.

Donji dijagram klasa prikazuje odnose.

implementirati nasljeฤ‘ivanje u PHP-u

Imajte na umu da krava nasljeฤ‘uje klasu Animal i definira vlastitu varijablu i metode.

Sada kodirajmo klasu 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;
    }
}
?>

Sada kodirajmo klasu Lion.

<?php
class Lion extends Animal
{
    public function __construct($family, $food)
    {
        parent::__construct($family, $food);
    }
}
?>

OVDJE,

  • โ€žklasa โ€ฆ proลกiruje Animalโ€œ omoguฤ‡uje klasama Cow i Lion koriลกtenje metoda iz klase Animal (nasljeฤ‘ivanje).

Kako kreirati objekt klase

Klase ลฝivotinja, Krava i Lav trebale bi sve biti u istom direktoriju radi jednostavnosti.

Sada kreirajmo aplikaciju koja koristi naลกe klase.

Primjer PHP klase

<?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();
?>

Testiranje naลกe aplikacije

Sada pogledajmo naลกu aplikaciju u web pregledniku.

Nasljeฤ‘ivanje u PHP-u

Oba objekta ponovno koriste metode get_family i get_food naslijeฤ‘ene od klase Animal, ลกto demonstrira nasljeฤ‘ivanje u akciji.

Kako implementirati polimorfizam u PHP-u

Recimo da ลพelimo razviti aplikaciju koja se povezuje s razliฤitim bazama podataka kao ลกto su MySQL i SQL Server, ali koristi isto uniformno suฤelje. Moลพemo stvoriti suฤelje koje definira standardne metode i abstract klasa koja implementira uobiฤajene metode.

  • Suฤelje โ€“ sliฤno je klasi. On samo definira metode i parametre.
  • Kormilartract klasa โ€“ to je klasa koja se ne moลพe koristiti za izravno stvaranje objekta. Njegova je svrha pruลพiti djelomiฤne ili cjelovite implementacije uobiฤajenih metoda.

Dijagram klase u nastavku ilustrira odnos izmeฤ‘u naลกih trbuลกnih miลกiฤ‡atract klasa, suฤelje i implementacijske klase.

Nasljeฤ‘ivanje u PHP-u

Sada napravimo trbuลกne miลกiฤ‡etract klasa.

<?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;
    }
}
?>

OVDJE,

  • trbuลกnjacitrac"t class" znaฤi da se klasa ne moลพe izravno koristiti za stvaranje objekta
  • โ€ž$host, $dbโ€ฆโ€œ su varijable klase zajedniฤke svim implementacijama
  • โ€žfunction __construct(โ€ฆ)โ€œ je metoda konstruktora klase koja postavlja vrijednosti zajedniฤkih varijabli prilikom inicijalizacije

Sada kreirajmo suฤelje koje sadrลพi standardne metode, koje ฤ‡e biti implementirane razliฤito ovisno o mehanizmu baze podataka.

<?php
interface DBInterface
{
    public function db_connect();
    public function insert($data);
    public function read($where);
    public function update($where);
    public function delete($where);
}
?>

OVDJE,

  • "Suฤelje" je kljuฤna rijeฤ za stvaranje suฤelja
  • โ€œjavna funkcijaโ€ฆ(โ€ฆ)โ€ standardne su metode koje bi se trebale primijeniti

Sada stvorimo konkretne klase koje ฤ‡e proลกiriti klasu DBCommonMethods i implementirati suฤelje DBInterface. Prvo, 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 */ }
}
?>

Zatim, 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 */ }
}
?>

OVDJE,

  • โ€žklasa โ€ฆ proลกiruje DBCommonMethodsโ€œ koristi metode u DBCommonMethods
  • โ€žโ€ฆ implementira DBInterfaceโ€œ osigurava da klasa pruลพa standardne metode bez obzira na koriลกteni upravljaฤki program baze podataka.

Kod koji koristi gore navedene klase izgledao bi ovako:

<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>

Ili:

<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>

Ostatak koda bio bi isti za oba upravljaฤka programa, kao ลกto je:

<?php
$db->db_connect();
$db->insert($data);
?>

Ovo je polimorfizam u akciji: isti pozivi metoda rade na bilo kojem upravljaฤkom programu koji implementira suฤelje, tako da se okolni kod nikada ne mijenja kada promijenite mehanizme baze podataka.

Pitanja i odgovori

TrbuลกnjacitracKlasa t moลพe sadrลพavati i implementirane metode i svojstva, a klasa proลกiruje samo jedno. Suฤelje deklarira samo potpise metoda, a klasa moลพe implementirati viลกe njih. Koristite abstract klasa za dijeljenje koda, suฤelje za provoฤ‘enje contract.

ฤŒetiri stupa su enkapsulacija, nasljeฤ‘ivanje, polimorfizam i abstraccija. Ovaj vodiฤ se fokusira na prva tri; trbuลกnjaketraccija skriva sloลพene detalje iza jednostavnog suฤelja, ลกto PHP podrลพava s abstract klase i suฤelja.

Javni ฤlanovi su dostupni bilo gdje, privatni ฤlanovi samo unutar iste klase, a zaลกtiฤ‡eni ฤlanovi unutar klase i njezinih podklasa. Oni provode enkapsulaciju kontrolirajuฤ‡i tko moลพe ฤitati ili mijenjati svako svojstvo ili metodu.

Da. Dajte umjetnoj inteligenciji polja ili definiciju tablice i ona moลพe stvoriti klasu s tipiziranim svojstvima, konstruktorom te metodama get i set. Revpregledajte tipove i dodajte validaciju prije koriลกtenja klase.

Da. Zalijepite proceduralni skript i umjetna inteligencija moลพe grupirati povezane funkcije i podatke u klase, primijeniti enkapsulaciju i predloลพiti nasljeฤ‘ivanje ili suฤelja. Testirajte refaktorirani kod, jer bi ponaลกanje trebalo ostati identiฤno.

Saลพmite ovu objavu uz: