---
title: "PHP 8.4 è stato rilasciato: principali novità e miglioramenti"
date: 2024-11-24
lang: it
tags: [PHP]
description: "Versione 8.4 di PHP: principali novità e miglioramenti introdotti"
---

Il 21 novembre 2024 è stata rilasciata la versione **8.4** di **PHP**. Per la precisione, la versione **8.4.1**.

I rilasci più recenti di [Laravel Herd](https://herd.laravel.com/) e [PHPStorm](https://www.jetbrains.com/phpstorm/) supportano già questa versione.

Tra le principali novità:
- possibilità di concatenare `new` senza parentesi extra
- _property hooks_
- visibilità asimmetrica delle proprietà
- nuove funzioni relative alla ricerca negli array
- nuove funzioni `mb_`
- creare un oggetto DateTime partendo da un timestamp Unix
- parsing di HTML5
- deprecazioni e varie

## Possibilità di concatenare `new` senza parentesi extra

Fino a PHP 8.3 compreso, è necessario utilizzare le parentesi per racchiudere l'istanziazione della classe:

```php showLineNumbers
    # PHP <= 8.3.x
   (new MyCustomClass())->myMethod();
```

Ora è possibile scrivere, ad esempio:

```php showLineNumbers
    # PHP 8.4.x
    new MyCustomClass()->myMethod();
```
Questa sintassi consente di accedere a costanti, proprietà e metodi di classe senza dover utilizzare parentesi extra.

## Property hooks

Questa funzionalità, già presente in altri linguaggi quali C#, Kotlin e Swift, consente di specificare in che modo accedere a una proprietà - in lettura o scrittura - senza dover utilizzare metodi aggiuntivi o ricorrere ai metodi magici `__get()` e `__set()`.  
Nel momento in cui si definisce una proprietà, è possibile specificare un `getter` e/o un `setter` per sovrascrivere, rispettivamente, ciò che viene letto quando si accede a quella proprietà e in che modo viene valorizzata quando la si scrive.  
Ho scritto _e/o_ perché non è necessario specificarli entrambi.  
Vediamo un esempio:

```php showLineNumbers
<?php

class Person
{
    public function __construct(
        private string $firstName,
        private string $lastName
    )
    {
        //
    }
    
    public string $fullName {
        get => "$this->firstName $this->lastName"
            
        set => {
            [$this->firstName, $this->lastName] = explode(' ', $value, 2);
        }
    }
}    
```

## Visibilità asimmetrica

Le proprietà di classe ora possono avere una visibilità differente in lettura e in scrittura. Ad esempio, una proprietà potrebbe essere accessibile pubblicamente in lettura ma avere visibilità _protected_ in scrittura.

Ad esempio:

```php showLineNumbers
<?php
    
class Item
{
    public function __construct(
        public protected(set) string $id,
        public protected(set) string $name
    ) {}
}

$item = new Item(1, 'Plugin');

echo($item->name); // 'Plugin'
$item->name = 'Updated name'; // FATAL ERROR!
```

L'utilizzo degli _hook_ delle proprietà in combinazione con la visibilità asimmetrica permette di ottenere un'ampia flessibilità e soddisfare varie esigenze.

## Nuove funzioni relative alla ricerca negli array

PHP 8.4 introduce alcune nuove funzioni per la ricerca di elementi in un array:
- `array_find()`
- `array_find_key()`
- `array_any()`
- `array_all()`

Vediamo un esempio:

```php showLineNumbers
<?php

$array = [
    'a' => 'Pad',
    'b' => 'Mouse',
    'c' => 'Microphone',
    'd' => 'Monitor',
    'e' => 'Printer'
   ];

// Ritorna il primo elemento la cui lunghezza sia di 7 caratteri
var_dump(array_find($array, fn (string $value) => strlen($value) == 7)); // 'Monitor'

// Ritorna la chiave del primo dipositivo la cui lunghezza sia di almeno 6 caratteri
var_dump(array_find_key($array, fn (string $value) => strlen($value) > 6)); // 'c'

// Verifica se ci sia almeno un elemento la cui lunghezza sia inferiore a 5 caratteri
var_dump(array_any($array, fn (string $value) => strlen($value) < 5)); // true

// Verifica se tutti gli elementi abbiano lunghezza inferiore a 5 caratteri
var_dump(array_all($array, fn (string $value) => strlen($value) < 5 )); // false

````

## Nuove funzioni `mb_`

PHP 8.4 aggiunge le funzioni che supportano il multibyte:
- `mb_trim()`
- `mb_ltrim()`
- `mb_rtrim()`
- `mb_ucfirst()`
- `mb_lcfirst()`

Funzionamento e parametri sono analoghi alle corrispondenti funzioni non multibyte (es. `trim()`).

## Creare un oggetto DateTime partendo da un timestamp Unix

Per semplificare la creazione di un oggetto DateTime a partire da un timestamp Unix, è stato aggiunto il metodo `DateTimeImmutable::createFromTimestamp()`.

```php showLineNumbers
<?php
    
$datetime = DateTimeImmutable::createFromTimestamp(1732436675);
echo $datetime->format('d-m-Y'); // 24-11-2024
 
$datetime = DateTimeImmutable::createFromTimestamp(1732436675.432);
echo $datetime->format('d-m-Y h:i:s.u'); // 24-11-2024 08:24:35.432000
```

## Parsing di HTML5

La classe `DomHTMLDocument` consente di importare il contenuto di una pagina HTML5 e riconosce i tag semantici - ad esempio `main`, `article` e `section`.
È anche possibile leggere il contenuto a partire da un file, oppure creare un documento vuoto:

```php showLineNumbers
<?php
    
$html = '...<main>...</main>...';
$path = '/home/foo/dev/bar/file.html';

$htmlDocument = DomHTMLDocument::createFromString($html);
$anotherDocument = DomHTMLDocument::createFromFilePath($path);
$emptyDocument = DomHTMLDocument::createEmpty();
```

## Deprecazioni e varie

PHP 8.4 riporta un elenco piuttosto lungo di funzioni e caratteristiche deprecate, ovvero marcate per un'eventuale rimozione in futuro.  
Sono presenti, inoltre, nuove classi, interfacce e funzioni.

Per l'elenco completo, è possibile consultare
- [php.net](https://www.php.net/releases/8.4/en.php)
- il [changelog](https://www.php.net/ChangeLog-8.php#PHP_8_4) di PHP 8.4
- [PHP.watch](https://php.watch/versions/8.4) di PHP.watch
