Le Novità di PHP 8.4: Funzionalità Avanzate per Migliorare il Codice
Lo scorso 21 novembre 2024 è stata rilasciata la versione 8.4 di PHP, che è una major release ed inserisce molte funzionalità attese, che consentono a PHP di migliorare notevolmente il modo di scrivere il codice sorgente aiutando tutti gli sviluppatori.
Questo articolo elenca tutte le nuove funzionalità introdotte in questa versione; ogni funzionalità sarà spiegata nel dettaglio in articoli successivi.
La versione di PHP8.4 aggiunge al linguaggio le seguenti caratteristiche:
- Property Hooks
- Asymmetric Visibility
- Deprecated Attribute
- ExtDom con supporto HTML5
- Object API per BCMath
- Funzioni per array
- Sottoclassi PDO
- Accesso diretto metodi e proprietà
Property Hooks
PHP 8.4 introduce le Property Hooks, una sintassi elegante per gestire direttamente getter e setter all'interno delle proprietà, semplificando e ottimizzando il codice.
Prima di PHP 8.4: Getter e Setter Separati
Nel codice pre-8.4, era necessario creare metodi separati per gestire l'assegnazione e il recupero delle proprietà.
class Locale {
private string $countryCode;
public function setCountryCode(string $countryCode): void {
$this->countryCode = strtoupper($countryCode);
}
}
Con PHP 8.4
Con PHP 8.4, i getter e setter possono essere definiti direttamente accanto alla dichiarazione della proprietà.
class Locale {
public string $countryCode {
set(string $countryCode) {
$this->countryCode = strtoupper($countryCode);
}
}
}
Vantaggi
- Sintassi Concisa: Eliminazione di metodi getter e setter separati.
- Leggibilità Migliorata: Accesso e modifica diretta delle proprietà con logica integrata.
- Performance Ottimizzata: Riduzione delle chiamate ai metodi, migliorando l'efficienza.
- Supporto per IDE e Analisi Statica: Gli strumenti di sviluppo comprendono automaticamente il comportamento delle proprietà calcolate.
Con le Property Hooks, PHP 8.4 rende il codice più sicuro, semplice e facile da mantenere.
Asymmetric Visibility
PHP 8.4 introduce la visibilità asimmetrica delle proprietà, che consente di separare il controllo di lettura e scrittura delle proprietà, migliorando la sicurezza e l'encapsulation del codice.
Prima di PHP 8.4: Getter Espliciti
Prima dell'introduzione della visibilità asimmetrica, per permettere la lettura di una proprietà privata senza consentirne la modifica, si dovevano scrivere metodi getter separati. Ad esempio:
class PhpVersion {
private string $version = '8.3';
public function getVersion(): string {
return $this->version;
}
public function increment(): void {
[$major, $minor] = explode('.', $this->version);
$minor++;
$this->version = "{$major}.{$minor}";
}
}
Con PHP 8.4
Con PHP 8.4, si può definire una proprietà leggibile da qualsiasi parte del
codice ma modificabile solo all'interno della classe, utilizzando la sintassi
public private(set)
:
class PhpVersion {
public private(set) string $version = '8.4';
public function increment(): void {
[$major, $minor] = explode('.', $this->version);
$minor++;
$this->version = "{$major}.{$minor}";
}
}
Vantaggi
- Semplificazione del Codice: Non è più necessario scrivere metodi getter o setter separati.
- Migliore Encapsulation: Si protegge la logica interna evitando modifiche esterne accidentali.
- Maggiore Sicurezza: Controllo fine sull'accesso alle proprietà, riducendo il rischio di errori.
- Riduzione del Codice Boilerplate: Elimina la necessità di metodi getter e setter verbosi.
La visibilità asimmetrica rende il codice più sicuro, leggibile e manutenibile.
#[\Deprecated]
Attribute
PHP 8.4 introduce l'attributo #[\Deprecated]
, che consente di marcare metodi,
funzioni e costanti come deprecati con un avviso automatico durante
l'esecuzione, semplificando la transizione verso codice aggiornato.
Prima di PHP 8.4
La deprecazione veniva indicata tramite docblock, senza avvisi esecutivi:
/** @deprecated 8.3 Use getVersion() */
public function oldMethod() {}
Con PHP 8.4
Con #[\Deprecated]
, il codice diventa più esplicito e manutenibile:
#[\Deprecated(message: "Use newMethod()", since: "8.4")]
public function oldMethod() {}
Quando chiamato, PHP mostra un avviso dettagliato.
Vantaggi
- Avvisi Automatici: Chiarezza immediata sugli elementi deprecati.
- Documentazione Inline: Informazioni su messaggi e versioni direttamente nel codice.
- Facilità di Manutenzione: Addio ai docblock dispersivi.
Le Nuove Funzionalità di ext-dom
con Supporto HTML5
PHP 8.4 introduce il supporto ufficiale per HTML5 nel DOM, migliorando la
gestione dei documenti HTML e XML con le nuove classi Dom\HTMLDocument
e
Dom\XMLDocument
. Queste classi risolvono problemi di conformità e
semplificano la gestione dei nodi del DOM, mantenendo al contempo la
compatibilità con le vecchie classi.
Prima di PHP 8.4
La gestione del DOM era affidata a DOMDocument
, che aveva una sintassi
complessa e limitata nella conformità agli standard HTML5:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$node = $xpath->query(".//main/article[not(following-sibling::*)]")[0];
Con PHP 8.4
Con PHP 8.4, le nuove classi e metodi rendono la gestione del DOM più semplice e conforme agli standard:
$dom = Dom\HTMLDocument::createFromString($html);
$node = $dom->querySelector('main > article:last-child');
Vantaggi
- Conformità HTML5: Le nuove classi sono completamente compatibili con gli standard HTML5.
- Sintassi Intuitiva: La funzione
querySelector
semplifica le query DOM con sintassi CSS-like. - Gestione delle Classi Migliorata:
classList
offre metodi per lavorare facilmente con le classi. - Compatibilità Retroattiva: Le vecchie classi restano compatibili, consentendo una transizione graduale.
Object API per BCMath
PHP 8.4 introduce una nuova API orientata agli oggetti per BCMath, un modulo
che consente di effettuare calcoli matematici con precisione arbitraria. La
novità principale è la classe BcMath\Number
, che offre una gestione più
moderna e leggibile dei numeri, utilizzando operatori standard e garantendo
immutabilità.
Prima di PHP 8.4
Fino a PHP 8.4, BCMath utilizzava un'API procedurale, dove i calcoli venivano
effettuati con funzioni come bcadd
e bccomp
, che richiedevano numeri come
stringhe e una gestione manuale della precisione.
$num1 = '0.12345';
$num2 = '2';
$result = bcadd($num1, $num2, 5);
Con PHP 8.4
Con la nuova classe BcMath\Number
, è possibile eseguire operazioni
matematiche direttamente sugli oggetti, migliorando la leggibilità e la
sicurezza del codice.
use BcMath\Number;
$num1 = new Number('0.12345');
$num2 = new Number('2');
$result = $num1 + $num2;
Vantaggi
- Leggibilità: Le operazioni matematiche sono più chiare e simili a quelle della programmazione tradizionale.
- Immutabilità: Gli oggetti
Number
sono immutabili, prevenendo modifiche accidentali. - Supporto per Stringhe: Gli oggetti possono essere utilizzati direttamente
in contesti stringa grazie all'interfaccia
Stringable
. - Approccio Moderno: L'uso della programmazione orientata agli oggetti rende il codice più coerente con altre funzionalità di PHP.
Nuove funzioni per array
PHP 8.4 introduce nuove funzioni per semplificare la gestione degli array:
array_find()
, array_find_key()
, array_any()
, e array_all()
. Queste
funzioni rendono il codice più conciso e leggibile, permettendo operazioni
comuni come la ricerca di valori, la verifica di condizioni sugli elementi o
sulle chiavi, e altro ancora.
Prima di PHP 8.4
Prima di PHP 8.4, operazioni come trovare un valore in un array richiedevano
codice verboso, come l'uso di foreach
o array_filter()
.
$animal = null;
foreach (['dog', 'cat', 'cow', 'duck', 'goose'] as $value) {
if (str_starts_with($value, 'c')) {
$animal = $value;
break;
}
}
var_dump($animal); // string(3) "cat"
Con PHP 8.4
Con array_find()
, è possibile risolvere lo stesso problema in modo molto più
semplice:
$animal = array_find(
['dog', 'cat', 'cow', 'duck', 'goose'],
static fn (string $value): bool => str_starts_with($value, 'c'),
);
var_dump($animal); // string(3) "cat"
Vantaggi
- Leggibilità: Le operazioni sugli array sono più facili da leggere e scrivere.
- Minor Codice: Non sono necessari cicli espliciti o funzioni come
array_filter()
. - Espressività: Le nuove funzioni rendono più chiaro l’intento del codice.
- Migliori Performance: Le nuove funzioni sono più dirette e ottimizzate rispetto alle soluzioni precedenti.
Sottoclassi Specifiche del Driver PDO
PHP 8.4 introduce sottoclassi specifiche per ogni driver PDO, come
Pdo\Sqlite
, Pdo\MySql
, e altri. Questo consente di accedere direttamente ai
metodi specifici del driver senza bisogno di verifiche manuali sul tipo di
connessione, migliorando la tipizzazione e la leggibilità del codice.
Prima di PHP 8.4
Fino alla versione 8.4, PDO restituiva sempre un oggetto generico, senza differenziare i driver, rendendo difficile l'accesso a metodi specifici e aumentando il rischio di errori runtime.
$connection = new PDO('sqlite:foo.db', $username, $password);
$connection->sqliteCreateFunction('prepend_php', ...);
Con PHP 8.4
Ora, PDO restituisce istanze di sottoclassi specifiche, come Pdo\Sqlite
, che
consentono l'accesso ai metodi pertinenti del driver senza errori.
$connection = PDO::connect('sqlite:foo.db', $username, $password);
$connection->createFunction('prepend_php', ...);
Vantaggi
- Tipizzazione forte per ogni driver.
- Migliore chiarezza nell'uso dei metodi specifici del driver.
- Codice più sicuro e meno soggetto a errori runtime.
Con PHP 8.4, l'uso di PDO diventa più intuitivo, sicuro e allineato con le migliori pratiche moderne.
Accesso Diretto a Metodi e Proprietà su Oggetti Istanziati
In PHP 8.4, è possibile accedere direttamente a metodi e proprietà di un oggetto appena creato senza usare parentesi.
Prima di PHP 8.4
var_dump((new PhpVersion())->getVersion());
Con PHP 8.4
var_dump(new PhpVersion()->getVersion());
Vantaggi
- Codice più conciso: Elimina le parentesi extra.
- Leggibilità migliorata: Rende il codice più pulito e chiaro.
La modifica è retrocompatibile e semplifica il codice.
Conclusione
PHP 8.4 porta importanti innovazioni che semplificano la scrittura del codice e migliorano la sicurezza e la leggibilità. Nelle prossime settimane, approfondiremo ciascuna di queste funzionalità con articoli dedicati, esplorando come applicarle nei tuoi progetti. Non perdere i nostri prossimi approfondimenti su Property Hooks, visibilità asimmetrica e le altre novità di questa versione. Restate aggiornati!