Estendere le classi - OOP in PHP
Indice
In PHP, l'estensione di una classe si riferisce alla creazione di una nuova classe che eredita tutte le proprietà e i metodi della classe genitore. La nuova classe figlia può quindi aggiungere nuove funzionalità o sovrascrivere i comportamenti ereditati dalla classe genitore.
Perché è utile estendere una classe?
Estendere una classe si rivela molto utile sopratutto per i seguenti motivi:
- Riutilizzo del codice: l'estensione delle classi permette di riutilizzare il codice già scritto, evitando la duplicazione di codice e risparmiando tempo.
- Organizzazione del codice: l'estensione delle classi aiuta ad organizzare il codice in modo gerarchico e coerente, semplificando la manutenzione e l'aggiornamento del codice in futuro.
- Specializzazione delle classi: l'estensione delle classi consente di creare classi specializzate per specifici scopi senza dover riscrivere tutto il codice della classe genitore.
- Struttura gerarchica: l'estensione delle classi consente di mantenere una struttura gerarchica tra le classi che può essere facilmente comprensibile e mantenibile.
Sintassi utilizzata per estendere una classe
class ChildClass extends ParentClass {
// Aggiungere eventuali metodi o proprietà specifici della classe figlia
}
Invocare il costruttore parent
La keyword parent::
è utilizzata all'interno di una classe figlia per richiamare il costruttore della classe genitore. Il costruttore della classe genitore viene chiamato per inizializzare le proprietà e i metodi ereditati dalla classe genitore.
Sintassi per invocare il costruttore del genitore parent::
La sintassi per utilizzare parent::
per richiamare il costruttore della classe genitore è la seguente:
class ChildClass extends ParentClass {
public function __construct($arg1, $arg2) {
parent::__construct($arg1); // richiama il costruttore della classe genitore
// esegue eventuali inizializzazioni specifiche della classe figlia
}
}
Esempio di estensione di una classe
/lib/userx.php
- Creiamo una classe chiamata Userx.
- La classe contiene tre variabili: nome, password e email.
- Creiamo quattro metodi: __construct, getName, getPassword, riepilogo.
- Il metodo __construct viene eseguito quando si crea un'istanza della classe Userx ed accetta tre argomenti (nome, password e email) che vengono assegnati alle variabili della classe.
- I metodi getName e getPassword restituiscono il valore delle variabili nome e password rispettivamente.
- Il metodo riepilogo restituisce un riassunto delle proprietà contenute nella classe
<?php
// Creazione Classe
class Userx
{
// Definizione proprietà
public $nome;
private $password;
private $email;
// Metodo construct per creazione instanze
public function __construct(string $nome, string $password, string $email){
$this->nome = $nome;
$this->password = $password;
$this->email = $email;
}
// Metodo per restituire il nome dell'utente
public function getName(){
return $this->nome;
}
// Metodo per restituire la password dell'utente
public function getPassword(){
return $this->password;
}
// Metodo per restituire l'email dell'utente
public function getEmail(){
return $this->email;
}
// Metodo per restituire un riepilogo
public function riepilogo(){
return "Utente: " . $this->nome . "\n"
. "Password: " . $this->password . "\n"
. "Email: " . $this->email;
}
}
?>
Importiamo il file che contiene la classe genitore.
Creiamo una classe (Admin) che estende la classe Userx.
Dichiariamo una proprietà $isAdmin
Creiamo un metodo construct che prende quattro argomenti in input: nome, password, email e un booleano che indica se l'utente è un admin o meno.
La classe Admin ha anche un metodo chiamato promoteUser che stampa un messaggio a seconda del valore del booleano isAdmin.
/lib/admin.php
- Importiamo il file che contiene la classe genitore
- Estendiamo la classe Userx (genitore) con la classe Admin
- Creiamo tre metodi: __construct, promoteUser e riepilogo.
- Il metodo __construct viene eseguito quando si crea un'istanza della classe Admin ed accetta 4 argomenti in input (nome, password, email e isAdmin).
- All'interno del metodo __construct viene invocato il costruttore parent:: che serve ad invocare proprietà e metodi della classe genitore (in questo caso Userx) e gli vengono passati in input i 3 argomenti (nome, password ed email) sottoforma di named arguments.
- Creiamo il metodo isAdmin() che contiene un if else che stampa una frase a seconda di se il booleano della proprietà isAdmin è su true o false.
- Creiamo un metodo riepilogo che importa dalla classe genitore lo stesso metodo (riepilogo) e lo va a sovrascrivere concatenando il metodo isAdmin.
<?php
// Utilizzo della funzione per importare la classe estesa
require __DIR__ . '/userx.php';
// Creazione di una classe che estende la classe Userx
class Admin extends Userx
{
// Dichiarazione della proprietà
private $isAdmin;
//Dichiarazione del costruttore della classe con 4 argomenti passati in input
public function __construct($nome,$password,$email,bool $isAdmin){
parent::__construct(password: $password,email: $email,nome: $nome); // Invocazione della classe genitore passandogli i primi tre argomenti con i named arguments.
$this->isAdmin = $isAdmin; // Assegnazione dell'argomento isAdmin alla proprietà dell'oggetto.
}
// Dichiarazione del metodo per verificare se un utente è Admin o meno.
public function promoteUser(){
if($this->isAdmin == true){
return "L'utente $this->nome è un amministratore \n";
} else {
return "L'utente $this->nome non è un amministratore \n";
}
}
// Sovrascrivere il metodo riepilogo() di UserX per includere altre proprietà
public function riepilogo(){
$riepilogo = parent::riepilogo(); // Ereditiamo il metodo riepilogo dalla classe genitore
return $riepilogo . "\n" . $this->promoteUser() ; // con $this->promoteuser() aggiungiamo il metodo promoteuser al metodo riepilogo()
}
}
?>
/extends.php
- Dichiriamo di voler usare un controllo del codice rigoroso per la definizione del tipo.
- Importiamo il file che contiene la classe Admin
- Creiamo due utenti passando in input (tramite named arguments) le proprietà
- Invochiamo i metodi di cui abbiamo bisogno.
<?php
// Strict Typing: Codice più rigoroso nella definizione del tipo
declare(strict_types = 1);
// Richiesta del file che contiene la classe Admin
require __DIR__ . '/lib/admin.php';
/* Creazione di un istanza della classe Admin (che richiama la classe parent userX)
passando in input al costruttore tramite named arguments i valori
*/
$utente1 = new Admin(nome:'Donato',email:'donato@test.it',password:'XXX123',isAdmin:true);
$utente2 = new Admin(nome:'Martina',email:'martina@test.it',password:'XXX567',isAdmin:false);
// stampa il metodo della classe Admin promoteUser()
echo $utente1->promoteUser() . "\n";
// stampa il metodo della classe Userx (genitore) getname()
echo $utente2->getName(),"\n";
// stampa il metodo riepilogo() presente all'interno della classe figlia (ha sovrascritto quello della classe padre);
echo $utente2->riepilogo();
?>