ESTENDERE UNA CLASSE INTRODUZIONE

php logoLa classe Corso è la classe che utilizziamo per creare corsi di backend o frontend. Potremmo utilizzare dei metodi e proprietà pubbliche specializzate per i corsi Frontend e Backend, in modo da rendere la classe più utile. Primo questo modo di sviluppare software implica che la classe Corso crescerà molto rapidamente, secondo se creiamo un oggetto per il Frontend tale oggetto potrà accedere a metodi e proprietà che non sono necessari. Il problema più grosso è che stiamo mescolando le proprietà e i metodi specifici per i corsi Backend e Frontend.

LE CLASSI BACKEND E FRONTEND

Potremmo creare due classi una per il Backend e una per il Frontend con proprietà e metodi specifici. Però supponiamo che la classe Corso abbia un metodo che ci serve per entrambe le classi, in queste condizioni dovremmo duplicare il metodo due volte. Questa non è una buona pratica, la duplicazione del codice è sempre da evitare. Lasciamo la classe Corso così com’è e creiamo due classi specifiche, una classe Backend e una Frontend. La classe Corso va estesa ereditando il metodo riepilogo che servirà ad entrambe le classi.

L’EREDITARIETA’

Per farlo sfruttiamo uno dei pilastri della OOP che è l’ereditarietà tramite la keyword extends posizionata dopo il nome della classe. Possiamo ereditare attributi e metodi della classe Corso che sono stati indicati con visibilità public o protected. Tale classe viene chiamata superclasse mentre le altri due classi sono chiamate sottoclassi.

Copy to Clipboard
Copy to Clipboard
Copy to Clipboard
Copy to Clipboard

$php = new Backend();

$css = new Frontend();

var_dump ($css, $php);

L’immagine a fianco riporta il risultato del var_dump. Come si vede sono state ereditate, ma ovviamente non inizializzate in quanto il costruttore della classe Corso non è stato invocato, tutte le proprietà della classe Corso. Un altro dettaglio importante da conoscere è che PHP non supporta l’ereditarietà multipla, ossia possiamo ereditare solo da una superclasse.

Classes

INVOCARE IL COSTRUTTORE PARENT

Quando creiamo una istanza della classe figlia verrà invocato il costruttore di tale classe ma non il costruttore della classe parent. Se rimuoviamo il costruttore all’interno della sottoclasse, ad esempio, Frontend verrà richiamato il costruttore parent. Se dalla sottoclasse vogliamo invocare un metodo della classe parent dobbiamo usare la keyword parent.

Call constructor class parent

VISIBILITA’ PUBLIC PROTECTED PRIVATE

Una proprietà o metodo dichiarato come public è accessibile ovunque. protected è visibile alle classi figlie (sottoclassi della classe parent) ma non è accessibile esternamente a proprietà e metodi tramite le istanze, una proprietà o metodo private non è visibile nelle classi figlie né esternamente tramite le istanze. Se all’interno della superclasse abbiamo indicato un metodo come public, anche nelle sottoclassi deve essere public altrimenti otterremo un errore fatale. Invece se all’interno di una superclasse diamo visibilità protected, nelle sottoclassi possiamo usare lo stesso ambito di visibilità o maggiore (public).

NAMED ARGUMENTS

In PHP 8 grazie ai named arguments possiamo usare questa sintassi per inizializzare il costruttore. Non ha importanza l’ordine degli argomenti.

$corsoPHP = new Corso( prezzo:19 , titolo:”PHP” );

In questo caso abbiamo invertito prezzo e titolo.

CODICE COMPLETO DELLE CLASSI UTILIZZATE

Copy to Clipboard
Copy to Clipboard
Copy to Clipboard
Copy to Clipboard

METODI GETTER E SETTER

Un metodo getter ritorna il valore di una proprietà, mentre setter imposta il valore di una proprietà. Grazie alle proprietà tipizzate introdotte in PHP 7.4 possiamo evitare i metodi getter e setter.

Getter and setter

PROPRIETA’ TIPIZZATE

Grazie alle proprietà tipizzate introdotte in PHP 7.4 possiamo evitare i metodi getter e setter.

PROPERTY

PROPRIETA’ READ-ONLY

Da PHP 8.1 possiamo rendere le proprietà di sola lettura grazie alla keyword readonly (Vedi proprietà prezzo della classe Corso).

APPROFONDIMENTO

In PHP, i concetti di “proprietà tipizzate” e “read-only” sono stati introdotti per migliorare la gestione del codice orientato agli oggetti, consentendo un controllo più preciso sul tipo di dati e sull’accesso alle proprietà di una classe. Vediamo questi concetti nel dettaglio.

1. Proprietà Tipizzate (Typed Properties)

Le proprietà tipizzate sono state introdotte in PHP 7.4. Esse permettono di dichiarare un tipo per le proprietà di una classe. Quando si usa una proprietà tipizzata, PHP impone che il valore assegnato alla proprietà sia del tipo specificato, altrimenti viene generato un errore.

Esempio di proprietà tipizzate:

class User {
     public string $name;
     public int $age;

     public function __construct(string $name, int $age) {
          $this->name = $name;
          $this->age = $age;
     }
}

$user = new User(“Alice“, 30);
echo $user->name; // Alice

In questo esempio, la proprietà $name è di tipo string, e $age è di tipo int. PHP garantisce che solo valori di tipo corretto possano essere assegnati a queste proprietà.

2. Read-Only Properties

A partire da PHP 8.1, è stata introdotta la possibilità di dichiarare proprietà “read-only”. Una proprietà read-only può essere inizializzata una sola volta e non può essere modificata successivamente. Questo è utile quando si desidera garantire che una proprietà mantenga lo stesso valore per tutta la vita dell’oggetto.

Esempio di proprietà read-only:

class User {
       public readonly string $name;
       public readonly int $age;

       public function __construct(string $name, int $age) {
           $this->name = $name;
           $this->age = $age;
       }
}

$user = new User(“Alice“, 30);
echo $user->name; // Alice

// Tentare di modificare la proprietà dopo la sua inizializzazione genererà un errore
// $user->name = “Bob”; // Fatal error: Cannot modify readonly property User::$name

3. Costruttore Parent

Il costruttore parent viene utilizzato per richiamare il costruttore della classe genitore da una classe figlia. È utile quando la classe figlia estende una classe genitore e si desidera mantenere il comportamento del costruttore della classe base, possibilmente aggiungendo ulteriori inizializzazioni nella classe figlia.

Esempio di utilizzo del costruttore parent:

class Person {
       protected string $name;

       public function __construct(string $name) {
           $this->name = $name;
       }
}

class Employee extends Person {
       private int $salary;

       public function __construct(string $name, int $salary) {
       parent::__construct($name); // Richiama il costruttore della classe genitore
       $this->salary = $salary;
      }
}

In questo esempio, la classe Employee estende la classe Person. Il costruttore di Employee utilizza parent::__construct($name) per richiamare il costruttore della classe Person, garantendo che la proprietà $name sia inizializzata correttamente, oltre a inizializzare la proprietà $salary specifica della classe Employee.

Riassunto

Proprietà Tipizzate: Permettono di definire un tipo per le proprietà della classe, garantendo che solo valori di quel tipo siano accettati.

Proprietà Read-Only: Proprietà che possono essere inizializzate una sola volta e non possono essere modificate successivamente.

Costruttore Parent: Utilizzato nelle classi derivate per richiamare il costruttore della classe base, mantenendo e estendendo il comportamento di inizializzazione.

Questi concetti migliorano la robustezza e la sicurezza del codice, riducendo errori e comportamenti imprevisti.

LINK AI POST PRECEDENTI

IL LINGUAGGIO PHP

LINK AL CODICE SU GITHUB

GITHUB