Estendere le classi - OOP in PHP

Estendere le classi - OOP in PHP

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:

  1. Riutilizzo del codice: l'estensione delle classi permette di riutilizzare il codice già scritto, evitando la duplicazione di codice e risparmiando tempo.
  2. 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.
  3. Specializzazione delle classi: l'estensione delle classi consente di creare classi specializzate per specifici scopi senza dover riscrivere tutto il codice della classe genitore.
  4. 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();

?>

Scritto da Donato Pirolo

Ciao, sono Donato, frontend developer con una smisurata passione per la SEO. Creo strumenti ad hoc per aiutare aziende e professionisti ad essere cercati sul web e trovare clienti.

Potrebbero interessarti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Copyright © 2023
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram