Tra le nuove funzionalità introdotte da PHP 8.1 troviamo anche la possibilità di dichiarare una proprietà tramite il modificatore readonly
il cui compito è quello di prevenire qualsiasi modifica della proprietà stessa dopo l'inizializzazione.
Una proprietà di classe che sia stata dichiarata come non modificabile perché in "sola lettura" può essere inizializzata una volta sola e il valore impostato per essa non può essere cambiato, quindi nel caso in cui si provasse a modificare forzatamente tale valore l'applicazione produrrebbe un errore.
Sintassi delle proprietà readonly
A livello sintattico è possibile dichiarate una proprietà readonly introducendo readonly
tra il modificatore di accesso e il type hint o indicazione del tipo, come nell'esempio seguente:
public readonly string $Immodificabile;
Il modo migliore per descriverne il funzionamento è quello di inserire tale espressione all'interno di una classe con cui effettuare il confronto tra una proprietà modificabile e una proprietà readonly:
class Blah {
public string $Modificabile;
public readonly string $Immodificabile;
public function __construct(
string $Modificabile,
string $Immodificabile) {
$this->Modificabile = $Modificabile;
$this->Immodificabile = $Immodificabile;
}
}
Nella classe proposta abbiamo due proprietà: $Modificabile
, una proprietà con modificatore d'accesso public
il cui valore può essere modificato in qualsiasi momento, sia all'interno dei metodi di classe dal loro esterno:
$blah = new Blah("X", "Y");
$blah->$Modificabile = "Z";
$Immodificabile
permette comunque l'accesso in lettura, ma un'espressione come la seguente:
$blah->$Immodificabile = "w";
restituisce un errore.
Nello stesso modo, in presenza di una classe come la seguente:
class Prova {
public readonly string $Immodificabile;
public function __construct(string $Immodificabile) {
$this->immodificabile = $Immodificabile;
}
}
$prova = new Prova("blah");
var_dump($prova->immodificabile);
$prova->immodificabile = "blah";
Abbiamo una prima inizializzazione perfettamente lecita dal punto di vista delle proprietà readonly:
$this->immodificabile = $Immodificabile;
e una seconda assegnazione non consentita dal costrutto:
$prova->immodificabile = "blah";
che restituisce un errore come il seguente:
Error: Cannot modify readonly property Prova::$Immodificabile
Da questo punto di vista è interessante notare come l'errore venga prodotto anche se il valore utilizzato è il medesimo, quello che conta infatti è che non possono essere apportate delle modifiche una volta effettuata la dichiarazione.
E' infine utile sottolineare che una proprietà readonly non ha il solo limite di poter essere dichiarata una volta sola, ciò infatti deve e può avvenire soltanto dallo scope in cui avviene la dichiarazione.