PHP ha visto una notevole evoluzione dalla sua nascita, con ogni versione che introduce miglioramenti per renderlo più potente.
Gli aggiornamenti di versione minor, come PHP 8.4, portano un mix di nuove funzionalità.
In questo articolo esploreremo le aggiunte più importanti di PHP 8.4.
Property Hooks
I Property Hooks rappresentano una delle novità principali introdotte in PHP 8.4. Questa funzionalità consente agli sviluppatori di definire comportamenti personalizzati per la lettura e la scrittura delle proprietà di una classe, eliminando la necessità di usare metodi getter e setter tradizionali o metodi magici come __get() e __set().
Come funzionano i Property Hooks?
Con i Property Hooks, è possibile aggiungere logica personalizzata direttamente sulle proprietà usando le parole chiave get e set. Di seguito un esempio pratico:
class Locale {
public string $languageCode;
public string $countryCode {
set (string $countryCode) {
$this->countryCode = strtoupper($countryCode);
}
}
public string $combinedCode {
get => sprintf("%s_%s", $this->languageCode, $this->countryCode);
set (string $value) {
[$this->languageCode, $this->countryCode] = explode('_', $value, 2);
}
}
}
$brazilianPortuguese = new Locale('pt', 'br');
echo $brazilianPortuguese->countryCode; // Output: BR
echo $brazilianPortuguese->combinedCode; // Output: pt_BR
Questo esempio mostra come personalizzare la scrittura di una proprietà per convertirne il valore in maiuscolo e come generare una proprietà virtuale combinando più valori.
Vantaggi rispetto alle versioni precedenti
Nelle versioni precedenti, per ottenere una funzionalità simile, era necessario ricorrere a metodi magici o a getter e setter separati. Ad esempio:
class User_OLD {
private string $_name;
public function __get(string $propName): mixed {
return match ($propName) {
'name' => $this->_name,
default => throw new Error("Undefined property $propName"),
};
}
public function __set(string $propName, $value): void {
if ($propName === 'name' && strlen($value) === 0) {
throw new ValueError("Name cannot be empty");
}
$this->_name = $value;
}
}
Con i Property Hooks, la sintassi è più semplice e leggibile:
class User {
public string $name {
set {
if (strlen($value) === 0) throw new ValueError("Name cannot be empty");
$this->name = $value;
}
}
}
Possibili utilizzi
Alcuni casi d’uso pratici per i Property Hooks includono:
- Validazione dei dati prima della scrittura
- Proprietà virtuali calcolate
- Conversione automatica di formati o unità
Visibilità asimmetrica delle proprietà
PHP 8.4 introduce il supporto per la visibilità asimmetrica delle proprietà, permettendo livelli di accesso differenti per la lettura (get) e la scrittura (set).
Questa funzionalità semplifica scenari in cui le proprietà necessitano di accesso pubblico in lettura ma limitato in scrittura.
Documentazione ufficiale.
class Esempio {
public protected(set) string $nome;
public function __construct(string $nome) {
$this->nome = $nome;
}
}
Attributo #[\Deprecated]
L’attributo #[\Deprecated] standardizza il modo in cui gli sviluppatori possono contrassegnare metodi, funzioni o costanti come deprecati.
Fornisce un messaggio strutturato per gli avvisi di deprecazione.
Documentazione ufficiale.
class Esempio {
#[\Deprecated(message: "Usa il metodo newMethod() invece", since: "8.4")]
public function oldMethod() {
// Vecchia implementazione
}
public function newMethod() {
// Nuova implementazione
}
}
Miglioramenti al DOM API con supporto per HTML5
L’estensione DOM ora supporta la gestione di documenti HTML5 con nuove classi standardizzate nel namespace Dom.
Questo aggiornamento risolve problemi di conformità e semplifica la manipolazione degli HTML.
Documentazione ufficiale.
$html = '<main><article>Contenuto</article></main>';
$dom = Dom\HTMLDocument::createFromString($html);
$nodo = $dom->querySelector('main > article');
echo $nodo->textContent; // Output: "Contenuto"
API orientata agli oggetti per BcMath
Il nuovo oggetto BcMath\Number consente un approccio orientato agli oggetti per operazioni aritmetiche ad alta precisione.
Supporta operatori standard e implementa l’interfaccia Stringable per i contesti stringa.
Documentazione ufficiale.
use BcMath\Number;
$num1 = new Number('0.12345');
$num2 = new Number('2');
$risultato = $num1 + $num2;
echo $risultato; // Output: "2.12345"
Nuove funzioni per gli array
PHP 8.4 introduce nuove funzioni per la gestione degli array, tra cui:
array_find(): Trova il primo elemento corrispondente.array_find_key(): Trova la chiave del primo elemento corrispondente.array_any(): Verifica se un elemento corrisponde a una condizione.array_all(): Verifica se tutti gli elementi corrispondono a una condizione.
Sottoclassi specifiche per driver PDO
Le sottoclassi specifiche per i driver PDO (ad esempio, Pdo\MySql, Pdo\Sqlite) permettono metodi specifici per i driver.
Documentazione ufficiale.
Chiamata ai metodi senza parentesi
PHP 8.4 permette la chiamata ai metodi senza parentesi se non richiedono argomenti obbligatori.
Documentazione ufficiale.
class Esempio {
public function versione(): string {
return "8.4";
}
}
$esempio = new Esempio();
echo $esempio->versione; // Output: "8.4"