Tra le novità più interessanti del recentemente rilasciato PHP 8.2 vi è la possibilità di definire delle classi in sola lettura. Per capire l'importanza di tale novità è possibile partire dal concetto di DTO (Data Transfer Object) o oggetto di trasferimento dati.
Un DTO è sostanzialmente uno schema di design utile nel caso in cui si vogliano veicolare dati all'interno della medesima applicazione, esso si differenzia da un oggetto per l'accesso ai dati (o oggetto di business) perché ha come unico scopo quello di rendere possibile l'allocazione di informazioni, permettendone il recupero.
PHP e parametri in sola lettura
Tramite questo Design Pattern disponiamo quindi di un oggetto che stabilisce in che modo i dati diventano disponibili nel contesto di un software. In alcuni casi tale schema necessita di non essere modificabile, motivo per il quale si ha il bisogno di definire delle proprietà in sola lettura.
Fino all'ultima versione di PHP l'unica soluzione possibile per ottenere questo risultato era quella di generare una classe e di popolarla con delle proprietà in sola lettura, come nell'esempio proposto di seguito:
class FilmDTO
{
public function __construct(
public readonly string $titolo,
public readonly string $regista,
public readonly DateTimeImmutable $data_di_uscita,
) {...}
}
A livello sintattico il codice mostrato in precedenza non presenta particolari complessità ma appare evidente quanto dichiarare ciascuna proprietà come readonly possa risultare dispendioso dal punto di vista del tempo. Soprattutto quando si devono gestire un elevato numero di argomenti.
Le classi in sola lettura
Per rendere più semplice la vita degli sviluppatori il team che si occupa di implementare il noto linguaggio di scripting server side hanno deciso di offrire una soluzione alternativa: permette la definizione di classi in sola lettura.
Proviamo quindi a riscrivere il listato proposto utilizzando questa nuova feature grazie alla quale basterà dichiarare la classe una singola volta:
public readonly class FilmDTO
{
public function __construct(
string $titolo,
string $regista,
DateTimeImmutable $data_di_uscita,
) {}
}
Data una classe readonly, tutte le proprietà che fanno riferimento ad essa saranno delle proprietà in sola lettura. Vi sono però dei limiti di cui tenere conto.
Il primo riguarda il fatto che non è possibile definire delle proprietà statiche all'interno di una classe in sola lettura. In secondo luogo una classe in sola lettura potrà essere estesa soltanto da classi che abbiano la medesima caratteristica.