Post Image

Visibilità Asimmetrica in PHP 8.4: Separare Lettura e Scrittura per un Codice Più Sicuro e Pulito

Con l'introduzione di PHP 8.4, una delle novità più rilevanti riguarda la visibilità asimmetrica delle proprietà, che permette di separare il controllo per la lettura e la scrittura delle proprietà, migliorando così l'incapsulamento e la sicurezza del codice. Sebbene concetti simili siano già presenti in altri linguaggi di programmazione come C# e Swift, PHP non aveva ancora una funzionalità del genere, rendendo questa introduzione particolarmente interessante.

Cos'è la Visibilità?

La visibilità in programmazione orientata agli oggetti (OOP) definisce i livelli di accesso alle proprietà e ai metodi di una classe. In PHP, le tre categorie principali di visibilità sono:

  • Publica: consente l'accesso a proprietà e metodi da qualsiasi parte del codice, sia all'interno della classe che all'esterno.
  • Privata: limita l'accesso solo all'interno della stessa classe. Le sottoclassi o il codice esterno non possono accedere alle proprietà o ai metodi privati.
  • Protetta: consente l'accesso all'interno della classe e delle sue sottoclassi, ma non dal codice esterno.

Un esempio di codice per comprendere meglio questi concetti potrebbe essere il seguente:

namespace App;

class Animale
{
    public string $nome;
    private string $specie;
}

$animale = new Animale();
echo $animale->nome;  // Funziona

echo $animale->specie;  // Errore: Impossibile accedere alla proprietà privata App\Animale::$specie

In questo esempio, la proprietà $nome è pubblica e può essere letta da qualsiasi parte del codice, mentre $specie è privata e non può essere accessibile esternamente.

La Visibilità Asimmetrica in PHP 8.4

Prima di PHP 8.4, se volevamo che una proprietà fosse leggibile ma non modificabile dall'esterno, dovevamo usare i metodi getter e setter, aumentando la verbosità del codice. PHP 8.4 cambia questo scenario con l'introduzione della visibilità asimmetrica, che consente di separare la visibilità di lettura e scrittura per la stessa proprietà.

Ad esempio, supponiamo di voler rendere una proprietà leggibile pubblicamente ma non scrivibile dall'esterno della classe. Con la visibilità asimmetrica, possiamo fare tutto ciò in modo molto più semplice e diretto.

Esempio di Codice con Visibilità Asimmetrica

Immagina di avere una classe Animale, e di voler esporre la proprietà $specie per la lettura, ma proteggerla da modifiche esterne. Ecco come fare con PHP 8.4:

class Animale
{
    public private(set) string $specie = 'Canide';
}

In questo caso, la proprietà $specie è leggibile pubblicamente, ma può essere modificata solo internamente alla classe. Questo significa che chiunque può leggere il valore della proprietà, ma nessuno può modificarlo direttamente dall'esterno della classe.

Sintassi della Visibilità Asimmetrica

La sintassi per implementare la visibilità asimmetrica è la seguente:

{visibilità di lettura} {visibilità di scrittura}(set) {tipo della proprietà} $nomeVariabile;

Ad esempio:

public private(set) string $specie = 'Canide';

Alcuni dettagli importanti da ricordare:

  • Disponibile solo da PHP 8.4 in poi: Verifica che la tua versione di PHP sia aggiornata.
  • Visibilità pubblica predefinita: Se non specificata, la visibilità di lettura è public per default.
  • Obbligo di dichiarazione del tipo: Quando si utilizza la visibilità asimmetrica, è obbligatorio dichiarare il tipo della proprietà.
  • Regole per i metodi getter e setter: Quando si usano i cosiddetti property hooks, le regole di visibilità si applicano anche ai metodi getter e setter.
  • Visibilità di scrittura più restrittiva della visibilità di lettura: La visibilità di scrittura deve essere la stessa o più restrittiva della visibilità di lettura.

Vantaggi della Visibilità Asimmetrica

La visibilità asimmetrica in PHP 8.4 porta con sé numerosi vantaggi che migliorano l'efficienza del codice e la sicurezza generale della classe. Uno dei principali benefici è la semplicità del codice: grazie a questa funzionalità, non è più necessario scrivere metodi getter e setter per ogni singola proprietà. In passato, ogni volta che si voleva esporre una proprietà in lettura o in scrittura, si dovevano creare questi metodi, aumentando la verbosità e la complessità del codice. Con la visibilità asimmetrica, possiamo dichiarare direttamente le proprietà con la visibilità desiderata, mantenendo il codice più pulito e facilmente manutenibile.

Un altro vantaggio significativo riguarda il miglioramento dell'incapsulamento. Prima dell'introduzione della visibilità asimmetrica, se volevamo proteggere una proprietà da modifiche esterne, dovevamo ricorrere a metodi o logiche aggiuntive. Ora, possiamo separare chiaramente le operazioni di lettura e scrittura, permettendo la lettura pubblica di una proprietà ma limitando la scrittura a livello privato. In questo modo, la logica interna della classe è protetta da modifiche non sicure da parte del codice esterno.

Inoltre, questa funzionalità contribuisce a una maggiore sicurezza del codice. Separando i permessi di lettura e scrittura, riduciamo il rischio di modifiche accidentali o indesiderate alle proprietà. Se una proprietà può essere letta ma non modificata, si impedisce che il suo valore venga alterato da parti del codice che non dovrebbero farlo. Questo aumento di sicurezza è particolarmente utile in contesti dove il controllo delle modifiche alle proprietà è cruciale.

Infine, la visibilità asimmetrica aiuta a eliminare il codice boilerplate, ossia il codice ripetitivo e superfluo. Non è più necessario scrivere metodi getter e setter separati per ogni proprietà, il che riduce la duplicazione e migliora la leggibilità generale del codice. Questo rende il codice non solo più pulito, ma anche più facile da mantenere nel tempo. In sintesi, la visibilità asimmetrica semplifica la gestione delle proprietà, migliorando la qualità e la sicurezza del codice.

Conclusioni

PHP 8.4 introduce una funzionalità potente che semplifica la gestione delle proprietà nelle classi, consentendo di separare la visibilità in lettura e scrittura. La visibilità asimmetrica riduce la necessità di metodi getter e setter, migliorando la sicurezza, l'encapsulamento e la leggibilità del codice. Questo nuovo strumento rappresenta un passo importante verso un codice più pulito e sicuro in PHP.