Le novità di PHP 8.4

Pubblicato il 29 novembre 2024 - Blog & Discussioni - Autore: devmentorpro

Il 21 novembre è stata rilasciata la tanto attesa versione di PHP 8.4, che porta con sé nuove funzionalità e miglioramenti pensati per rendere lo sviluppo web ancora più efficiente e potente. Dalle ottimizzazioni delle performance a nuovi strumenti per i programmatori, PHP 8.4 si conferma un passo avanti per il linguaggio che continua a dominare il panorama del web. Scopriamo insieme le novità principali!

Eliminiamo le parentesi!

Fino a questa versione, per accedere ai metodi e alle proprietà durante l'istanza della classe MiaClasse, era necessario racchiuderla tra parentesi, come nell'esempio seguente:

//PHP < 8.4
$service = (new User())->getAvatar(32, 32);

Questo aggiornamento rende l'accesso ai metodi della classe più fluido, senza la necessità di aggiungere parentesi o utilizzare un metodo di costruzione statico:

//PHP 8.4
$service = new User()->getAvatar(32, 32);

Nuove funzioni native

È vero che, quando lavoriamo con PHP, amiamo approfittare delle funzioni avanzate e delle utilità che semplificano il nostro codice. PHP 8.4 ha introdotto 4 nuove funzioni che migliorano ulteriormente la gestione degli array, offrendo strumenti più potenti e versatili per lavorare con i dati in modo ancora più efficiente.

  • array_find()
  • array_find_key()
  • array_any()
  • array_all()

array_find()

La funzione array_find($array, $callback) restituisce il primo elemento per cui il $callback restituisce true:

$array = [
	'grape',
    'pineapple',
    'strawberry',
    'kiwi',
];
 
$fruit = array_find($array, fn (string $value) => strlen($value) > 5);
 
echo $fruit // string(6) "orange"

array_find_key()

La funzione array_find_key($array, $callback) restituisce la chiave del primo elemento per cui il $callback restituisce true. Come array_find(), restituisce null se non viene trovato alcun elemento corrispondente:

$array = [
    'grape',
    'pineapple',
    'strawberry',
    'kiwi',
];
 
$key = array_find_key($array, fn (string $value) => strlen($value) > 5);
 
echo $key // int() 2

array_any()

Puoi utilizzare la funzione array_any() per verificare se almeno uno degli elementi dell'array restituisce true.

$array = [
    'grape',
    'pineapple',
    'strawberry',
    'kiwi',
];
 
$any = array_any($array, fn (string $value) => strlen($value) > 5);
 
echo $any // bool(true)

array_all()

Puoi utilizzare la funzione array_all() per verificare se tutti gli elementi dell'array restituiscono true.

$array = [
    'grape',
    'pineapple',
    'strawberry',
    'kiwi',
];
 
$all = array_all($array, fn (string $value) => strlen($value) > 5);
 
echo $all // bool(false)
 
$all = array_all($array, fn (string $value) => strlen($value) > 4);
 
echo $all // bool(true)

Non esitate a dare un'occhiata alla Documentazione di PHP 8.4

Property Hooks

le Property Hooks in PHP permettono di gestire le proprietà di un oggetto in modo più elegante e flessibile. Invece di utilizzare metodi getter e setter, gli hook consentono di eseguire codice automaticamente quando una proprietà viene letta o modificata. Questo migliora la leggibilità e riduce il codice boilerplate, permettendo di aggiungere logiche come la validazione dei dati o il logging in modo diretto e pulito. In sostanza, le Property Hooks semplificano la gestione delle proprietà, rendendo il codice più conciso e manutenibile.

// php < 8.4

class Locale
{
    private string $languageCode;
    private string $countryCode;

    public function __construct(string $languageCode, string $countryCode)
    {
        $this->setLanguageCode($languageCode);
        $this->setCountryCode($countryCode);
    }

    public function getLanguageCode(): string
    {
        return $this->languageCode;
    }

    public function setLanguageCode(string $languageCode): void
    {
        $this->languageCode = $languageCode;
    }

    public function getCountryCode(): string
    {
        return $this->countryCode;
    }

    public function setCountryCode(string $countryCode): void
    {
        $this->countryCode = strtoupper($countryCode);
    }

    public function setCombinedCode(string $combinedCode): void
    {
        [$languageCode, $countryCode] = explode('_', $combinedCode, 2);

        $this->setLanguageCode($languageCode);
        $this->setCountryCode($countryCode);
    }

    public function getCombinedCode(): string
    {
        return \sprintf("%s_%s", $this->languageCode, $this->countryCode);
    }
}

$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->getCountryCode()); // BR
var_dump($brazilianPortuguese->getCombinedCode()); // pt_BR

Quando invece con php 8.4 lo stesso codice può essere scrito in modo più conciso e pulito.

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);
        }
    }

    public function __construct(string $languageCode, string $countryCode)
    {
        $this->languageCode = $languageCode;
        $this->countryCode = $countryCode;
    }
}

$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->countryCode); // BR
var_dump($brazilianPortuguese->combinedCode); // pt_BR

Nuove funzioni mb_

In questa nuova versione, PHP introduce delle varianti multi-octet delle funzioni classiche come trim, ltrim, rtrim, ucfirst e lcfirst. Queste versioni sono progettate per supportare correttamente stringhe contenenti caratteri multibyte, come quelli nelle lingue asiatiche, che potrebbero non essere gestiti correttamente dalle versioni tradizionali di queste funzioni.

  • mb_trim
  • mb_ltrim
  • mb_rtrim
  • mb_ucfrirst
  • mb_lcfitst

Queste nuove funzioni saranno più robuste nell'elaborare caratteri che occupano più di un byte, evitando potenziali errori legati alla codifica di stringhe in UTF-8 o altre codifiche multibyte. Questo miglioramento aiuterà a rendere il trattamento delle stringhe più sicuro e coerente, senza la necessità di utilizzare librerie esterne o funzioni aggiuntive.

DateTimeImmutable

Con la nuova funzione createFromTimestamp(), PHP semplifica la creazione di un oggetto DateTime a partire da un timestamp Unix. Questa funzione supporta sia i timestamp standard che quelli con microsecondi, permettendo una gestione del tempo più precisa e intuitiva. Gli sviluppatori non dovranno più preoccuparsi della conversione manuale dei timestamp con microsecondi, rendendo il processo più rapido ed efficiente.

$dt = DateTimeImmutable::createFromTimestamp(1672531200);
$dt->format('Y-m-d'); // 2023-01-01
 
$dt = DateTimeImmutable::createFromTimestamp(1672531200.789);
$dt->format('Y-m-d h:i:s.u'); // 2023-01-01 00:00:00.789000

Conclusione

La comunità PHP continua a sorprenderci con le sue evoluzioni, dimostrando che il linguaggio è in continua crescita. Le nuove funzionalità sono già disponibili e arricchiscono PHP con strumenti moderni e potenti per lo sviluppo di applicazioni robuste.

Questi miglioramenti sono già stati implementati e sono pronti per essere utilizzati. Se siete curiosi di scoprire le novità, potete iniziare subito a testare le nuove funzionalità seguendo un tutorial.

PHP, lontano dal declino, continua a rinnovarsi e a consolidare la sua posizione come uno dei linguaggi più usati per lo sviluppo web. Chi pensava che PHP fosse superato rimarrà sorpreso dalla sua continua evoluzione!