Post Image

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

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!