Concetto di programmazione orientata agli oggetti (OOP) in PHP con esempio

โšก Riepilogo intelligente

La programmazione orientata agli oggetti in PHP modella un'applicazione attorno a oggetti del mondo reale utilizzando classi e oggetti. Questa guida illustra i principi OOP di incapsulamento, ereditarietร  e polimorfismo, come PHP li supporta e crea, passo dopo passo, esempi funzionanti di classi, ereditarietร  e interfacce.

  • ๐Ÿงฑ Classi e oggetti: Una classe definisce le proprietร  e i metodi di un'entitร  del mondo reale, e un oggetto รจ una singola istanza di quella classe.
  • ๐Ÿ”’ incapsulamento: Le variabili private con metodi get e set pubblici nascondono i dettagli interni e proteggono lo stato di un oggetto.
  • ๐Ÿ‘ช Ereditร : La parola chiave extends consente a una classe figlia di riutilizzare i metodi di una classe padre, riducendo la duplicazione del codice.
  • ๐Ÿ” Polimorfismo: Un'interfaccia definisce metodi standard che molte classi implementano in modo diverso dietro un unico concetto uniformetract.
  • ๐Ÿ“ Diagramma delle classi UML: Un diagramma di classi mostra il nome della classe, le variabili e i metodi, con i simboli piรน, meno e cancelletto che indicano rispettivamente l'ambito pubblico, privato e protetto.
  • ๐Ÿงฉ Interfacce e Abstract: Un addominalitracUna classe t condivide il codice comune, mentre un'interfaccia garantisce che ogni classe driver fornisca gli stessi metodi.
  • ๐Ÿค– Assistenza AI: Gli strumenti di intelligenza artificiale possono generare una classe PHP a partire da una descrizione e rifattorizzare il codice procedurale trasformandolo in codice pulito orientato agli oggetti.

Programmazione orientata agli oggetti in PHP

Cos'รจ l'OOP?

La programmazione orientata agli oggetti รจ un approccio allo sviluppo software che modella un'applicazione attorno a oggetti del mondo reale, come dipendenti, automobili e conti bancari. Una classe definisce le proprietร  e i metodi di un oggetto del mondo reale. Un oggetto รจ un'istanza di una classe.

Le tre componenti fondamentali della programmazione orientata agli oggetti sono:

  • Analisi orientata agli oggetti โ€“ funzionalitร  del sistema
  • Progettazione orientata agli oggetti โ€“ architettura del sistema
  • Programmazione orientata agli oggetti โ€“ implementazione dell'applicazione

Principi di programmazione orientata agli oggetti

I tre principi fondamentali della programmazione orientata agli oggetti sono:

  • incapsulamento โ€“ questo riguarda il nascondere i dettagli di implementazione ed esporre solo i metodi. Gli scopi principali dell'incapsulamento sono:
    • Ridurre la complessitร  dello sviluppo del software: nascondendo i dettagli di implementazione ed esponendo solo le operazioni, l'utilizzo di una classe diventa semplice.
    • Proteggere lo stato interno di un oggetto: l'accesso alle variabili di classe avviene tramite metodi come get e set. Questo rende la classe flessibile e di facile manutenzione.
    • Consente di modificare l'implementazione interna della classe senza preoccuparsi di compromettere il codice che la utilizza.
  • Ereditร  โ€“ questo riguarda la relazione tra classi. La relazione assume la forma di un genitore e un figlio. Il figlio utilizza i metodi definiti nella classe genitore. Lo scopo principale dell'ereditarietร  รจ:
    • Riutilizzabilitร : piรน elementi figli possono ereditare dallo stesso elemento padre. Questo รจ molto utile quando dobbiamo fornire funzionalitร  comuni come l'aggiunta, l'aggiornamento e l'eliminazione di dati dal database.
  • Polimorfismo โ€“ questo riguarda l'avere un'unica interfaccia con molte implementazioni diverse. Lo scopo principale del polimorfismo รจ:
    • Per semplificare la manutenzione delle applicazioni e renderle piรน estendibili.

OOP Concepts nel PHP

PHP รจ un linguaggio di scripting orientato agli oggetti; supporta tutti i principi sopra menzionati. I principi sopra menzionati vengono realizzati tramite:

  • incapsulamento โ€“ tramite l'uso dei metodi โ€œgetโ€ e โ€œsetโ€ e dei modificatori di accesso.
  • Ereditร  โ€“ tramite l'uso della parola chiave extends
  • Polimorfismo โ€“ tramite l'utilizzo della parola chiave implements

Ora che abbiamo le conoscenze di base dell'OOP e di come รจ supportato PHPVediamo ora alcuni esempi che mettono in pratica i principi sopra esposti.

Cos'รจ UML?

Il linguaggio di modellazione unificato (UML) รจ una tecnica utilizzata per progettare e documentare sistemi orientati agli oggetti.

UML produce diversi documenti, ma in questo articolo analizzeremo il diagramma delle classi, che รจ molto importante per la programmazione PHP orientata agli oggetti.

Esempio di diagramma di classi

OOP Concepts nel PHP

Chiave del diagramma di classi

  • Migliori scatola superiore contiene il nome della classe
  • Migliori casella centrale contiene le variabili di classe
  • Migliori scatola inferiore contiene i metodi della classe
  • Migliori meno (-) il segno indica ambito privato
  • Migliori piรน (+) il segno significa ambito pubblico
  • Migliori cancelletto (#) il segno significa ambito protetto

Come creare una classe in PHP

La parola chiave class viene utilizzata per definire una classe in PHP. Di seguito sono riportate le regole per creare una classe in PHP.

  • Il nome della classe dovrebbe iniziare con una lettera
  • Il nome della classe non puรฒ essere una parola riservata PHP
  • Il nome della classe non puรฒ contenere spazi

Supponiamo di voler creare una classe per rappresentare gli animali. Inizieremo identificando le caratteristiche comuni a tutti gli animali.

  • Tutti gli animali appartengono a una famiglia, come ad esempio gli erbivori, i carnivori, ecc.
  • Tutti gli animali mangiano cibo

Il diagramma sottostante mostra il diagramma delle classi per l'animale.

Crea una classe in PHP

Ora procediamo con la codifica della nostra classe 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;
    }
}
?>

QUI,

  • โ€œprivate $family, $foodโ€ significa che le variabili non possono essere accedute direttamente dallโ€™esterno della classe (incapsulamento).
  • โ€œpublic function __construct($familyโ€ฆ)โ€ รจ il metodo costruttore di PHP. Questa funzione viene chiamata ogni volta che viene creata un'istanza della classe. In questo caso, stiamo impostando la famiglia e il cibo.
  • โ€œpublic function getโ€ฆ()โ€ รจ il metodo utilizzato per accedere al valore della famiglia o del cibo (incapsulamento)
  • โ€œpublic function setโ€ฆ()โ€ รจ il metodo utilizzato per impostare il valore della famiglia o del cibo (incapsulamento)

Come implementare l'ereditarietร  in PHP

Lavoreremo con una mucca e un leone. Sia la mucca che il leone ereditano dalla classe Animale.

Il diagramma delle classi riportato di seguito mostra le relazioni.

implementare l'ereditarietร  in PHP

Si noti che la mucca eredita dalla classe Animal e definisce anche le proprie variabili e i propri metodi.

Ora procediamo con la codifica della classe 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;
    }
}
?>

Ora procediamo con la codifica della classe Lion.

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

QUI,

  • โ€œclass โ€ฆ extends Animalโ€ fa sรฌ che le classi Cow e Lion utilizzino i metodi della classe Animal (ereditarietร ).

Come creare un oggetto della classe

Le classi Animale, Mucca e Leone dovrebbero essere tutte nella stessa directory per semplicitร .

Creiamo ora l'applicazione che utilizza le nostre classi.

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

Testare la nostra applicazione

Ora visualizziamo la nostra applicazione in un browser web.

Ereditarietร  in PHP

Entrambi gli oggetti riutilizzano i metodi get_family e get_food ereditati dalla classe Animal, il che dimostra l'ereditarietร  in azione.

Come implementare il polimorfismo in PHP

Supponiamo di voler sviluppare un'applicazione che si connetta a diversi motori di database come MySQL and SQL Server ma utilizza la stessa interfaccia uniforme. Possiamo creare un'interfaccia che definisce i metodi standard e un assolutotracclasse t che implementa i metodi comuni.

  • Interfaccia โ€“ รจ simile a una classe. Definisce solo i metodi e i parametri.
  • Abstracclasse t โ€“ รจ una classe che non puรฒ essere utilizzata per creare direttamente un oggetto. Il suo scopo รจ fornire implementazioni parziali o totali di metodi comuni.

Il diagramma delle classi qui sotto illustra la relazione tra i nostri assolutitracClasse t, interfaccia e classi di implementazione.

Ereditarietร  in PHP

Creiamo ora i nostri addominalitracclasse 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;
    }
}
?>

QUI,

  • โ€œasstrac"Classe t" significa che la classe non puรฒ essere utilizzata direttamente per creare un oggetto
  • โ€œ$host, $dbโ€ฆโ€ sono variabili di classe comuni a tutte le implementazioni
  • โ€œfunction __construct(โ€ฆ)โ€ รจ il metodo costruttore della classe che imposta i valori delle variabili comuni allโ€™inizializzazione

Creiamo ora l'interfaccia che contiene i metodi standard, che verranno implementati in modo diverso a seconda del motore del database.

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

QUI,

  • โ€œinterfacciaโ€ รจ la parola chiave per creare interfacce
  • โ€œfunzione pubblicaโ€ฆ(โ€ฆ)โ€ sono i metodi standard che dovrebbero essere implementati

Creiamo ora le classi concrete che estenderanno la classe DBCommonMethods e implementeranno l'interfaccia DBInterface. Innanzitutto, 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 */ }
}
?>

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

QUI,

  • โ€œclass โ€ฆ extends DBCommonMethodsโ€ utilizza i metodi in DBCommonMethods
  • โ€œโ€ฆ implements DBInterfaceโ€ garantisce che la classe fornisca i metodi standard indipendentemente dal driver del database utilizzato.

Il codice che utilizza le classi sopra descritte avrebbe questo aspetto:

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

Oppure:

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

Il resto del codice sarebbe identico per entrambi i driver, ad esempio:

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

Questo รจ il polimorfismo in azione: le stesse chiamate di metodo funzionano su qualsiasi driver che implementi l'interfaccia, quindi il codice circostante non cambia mai quando si cambia motore di database.

DOMANDE FREQUENTI

Un addominalitracUna classe t puรฒ contenere sia metodi implementati che proprietร , e una classe estende solo uno dei due. Un'interfaccia dichiara solo le firme dei metodi, e una classe puรฒ implementarne molti. Utilizzare un abstracclasse t per condividere il codice, un'interfaccia per imporre un controllotract.

I quattro pilastri sono incapsulamento, ereditarietร , polimorfismo e assolutezza.traczione. Questo tutorial si concentra sui primi tre; assolutitraction nasconde dettagli complessi dietro un'interfaccia semplice, che PHP supporta con assolutatracclassi e interfacce t.

I membri pubblici sono accessibili ovunque, i membri privati โ€‹โ€‹solo all'interno della stessa classe e i membri protetti solo all'interno della classe e delle sue sottoclassi. Garantiscono l'incapsulamento controllando chi puรฒ leggere o modificare ciascuna proprietร  o metodo.

Sรฌ. Fornendo all'IA i campi o la definizione di una tabella, essa puรฒ generare una classe con proprietร  tipizzate, un costruttore e metodi get e set. RevEsamina i tipi e aggiungi la convalida prima di utilizzare la classe.

Sรฌ. Incolla lo script procedurale e l'IA puรฒ raggruppare funzioni e dati correlati in classi, applicare l'incapsulamento e suggerire ereditarietร  o interfacce. Testa il codice rifattorizzato, poichรฉ il comportamento dovrebbe rimanere identico.

Riassumi questo post con: