PHP 8.3 e PHP 8.4 rappresentano un punto di svolta per il linguaggio, introducendo funzionalità che cambiano radicalmente il modo di scrivere codice robusto e manutenibile. Questa guida approfondisce tre innovazioni chiave — Typed Class Constants, Property Hooks e json_validate — confrontandole con le versioni precedenti (8.0, 8.1, 8.2). Se hai già familiarità con PHP moderno, capirai come queste aggiunte eliminano workaround, aumentano la sicurezza del tipo e semplificano operazioni comuni. Se sei un principiante avanzato, troverai esempi concreti per adottarle subito.
Typed Class Constants in PHP 8.3
Le costanti di classe tipizzate (typed class constants) sono state introdotte in PHP 8.3. Prima di questa versione, le costanti potevano essere dichiarate solo senza un tipo esplicito; il tipo veniva dedotto dal valore, ma non poteva essere vincolato. Con PHP 8.3 è possibile specificare il tipo, ottenendo una maggiore sicurezza statica e una documentazione più chiara.
Dichiarazione e vantaggi
La sintassi è semplice: basta aggiungere il tipo prima del nome della costante:
class Status {
public const string DRAFT = 'draft';
public const string PUBLISHED = 'published';
public const int ACTIVE = 1;
}Prima di PHP 8.3, si poteva omettere il tipo, portando a potenziali incongruenze. Ad esempio, in PHP 8.0 o 8.1, le costanti erano sempre considerate dello stesso tipo del valore, ma non potevano essere verificate dal parser statico. Con la tipizzazione esplicita, uno strumento come PHPStan o Psalm può segnalare errori in fase di sviluppo.
Limitazioni e caso d'uso
Le costanti tipizzate supportano tutti i tipi primitivi (bool, int, float, string, array, null) e i tipi union di base, ma non accettano oggetti o classi come tipo (a meno che non siano definite tramite il costrutto final delle costanti in PHP 8.1). Per le enumerazioni (enum), il tipo è implicito. Un caso d'uso tipico è definire valori di configurazione o flag che devono rimanere coerenti:
class LoggerLevel {
public const string ERROR = 'error';
public const string WARNING = 'warning';
public const string INFO = 'info';
// Se qualcuno prova ad assegnare un valore non stringa, PHP 8.3 lancia un errore fatale
}Property Hooks in PHP 8.4
Property Hooks rappresentano forse la novità più dirompente di PHP 8.4. Consentono di aggiungere logica getter e setter direttamente sulla dichiarazione di una proprietà, eliminando la necessità di metodi magic come __get e __set. Prima di PHP 8.4, per implementare proprietà calcolate o con validazione, si doveva ricorrere a interfacce separate o a metodi get/set espliciti.
Sintassi base
La sintassi è simile a quella di altri linguaggi come Kotlin o C#: dopo la dichiarazione della proprietà, si aggiungono i blocchi get e set:
class User {
private string $firstName;
private string $lastName;
public function __construct(string $firstName, string $lastName) {
$this->firstName = $firstName;
$this->lastName = $lastName;
}
// Property Hook per fullName
public string $fullName {
get {
return $this->firstName . ' ' . $this->lastName;
}
set {
$parts = explode(' ', $value, 2);
$this->firstName = $parts[0];
$this->lastName = $parts[1] ?? '';
}
}
}In questo esempio, $fullName è una proprietà virtuale: non ha un proprio storage, ma legge e scrive su altre proprietà. È possibile anche dichiarare proprietà con backing store implicito usando set senza get o viceversa.
Vantaggi rispetto a __get/__set
I metodi magic hanno almeno due problemi: sono generici e non permettono tipizzazione esplicita per ogni proprietà virtuale. Con Property Hooks ogni proprietà può avere la propria logica, con tipi statici ben definiti. Inoltre, le prestazioni sono migliori perché non si passa per la funzione interceptor.
PHP 8.4 introduce anche la possibilità di usare Property Hooks all'interno di traits e interfacce (con sintassi di dichiarazione), ma l'implementazione concreta è ancora in evoluzione. Per ora sono permessi solo su proprietà pubbliche e protette.
json_validate in PHP 8.3
La funzione json_validate è un'aggiunta piccola ma potente di PHP 8.3. Risolve un problema comune: verificare se una stringa è un JSON valido senza doverla decodificare completamente. Prima di PHP 8.3, l'unico modo era chiamare json_decode e poi controllare json_last_error(), operazione che allocava memoria per l'intero oggetto decodificato.
Utilizzo
$jsonString = '{"name": "Mario"}';
// Vecchio approccio (PHP 8.0-8.2)
$decoded = json_decode($jsonString);
if (json_last_error() !== JSON_ERROR_NONE) {
// gestione errore
}
// Nuovo approccio (PHP 8.3+)
if (!json_validate($jsonString)) {
// gestione errore
}
json_validate restituisce true se la stringa è un JSON valido, false altrimenti. Accetta anche il secondo parametro $depth e il terzo $flags come json_decode. È particolarmente utile in contesti come la convalida di payload HTTP, log, o file di configurazione, dove non interessa l'oggetto decodificato ma solo la sintassi.
Vantaggi prestazionali
Non dovendo allocare la struttura dati risultante, json_validate è più veloce e consuma meno memoria, specialmente per JSON di grandi dimensioni. Inoltre evita effetti collaterali di json_decode (ad esempio, la creazione di oggetti stdClass).
Confronto con PHP 8.0, 8.1, 8.2
Le versioni 8.0, 8.1 e 8.2 hanno introdotto rispettivamente: named arguments, readonly properties, enums, fibers, first-class callable syntax, e deprecazioni come get_parent_class() senza argomenti. Tuttavia, mancavano le tre funzionalità qui trattate.
- Typed Class Constants: prima si poteva solo documentare con PHPDoc, ora il tipo è imposto dal linguaggio.
- Property Hooks: sostituiscono pattern come
__get/__seto getter/setter espliciti, offrendo una sintassi più pulita. - json_validate: prima si usava
json_decodecon controllo errori, ora esiste una funzione dedicata.
Questi miglioramenti completano il percorso di modernizzazione di PHP iniziato con la versione 8.0, rendendo il linguaggio sempre più espressivo e sicuro.
Best Practices e Conclusioni
Adottare queste novità richiede una pianificazione attenta, ma i benefici sono immediati:
- Usa Typed Class Constants in tutte le nuove classi che definiscono costanti pubbliche. Per costanti già esistenti, aggiungi il tipo solo se sicuro (attenzione a possibili valori misti).
- Introduci Property Hooks quando devi aggiungere logica a proprietà senza creare un metodo get/set separato. Evita di usarli per semplici accessi diretti.
- Sostituisci
json_decode + controllo erroriconjson_validateogni volta che hai solo bisogno di verificare la validità sintattica. Per la decodifica, continua a usarejson_decode.
Per approfondire tematiche correlate, consulta la nostra guida alla cybersecurity per sviluppatori e guida a Laravel 11 e 12. Riferimenti esterni: Migrazione a PHP 8.3 (documentazione ufficiale) e RFC Property Hooks (inglese).
Sponsored Protocol