notiziephp.it

Novità in PHP 8.6

Traduzione da Laravel News
15 Settembre 2026 Tempo di lettura: 6 minuti
Novità in PHP 8.6

La release annuale di PHP è ormai alle porte! PHP 8.6 sarà rilasciato il 19 novembre 2026. PHP 8.6 è attualmente in beta, con il feature freeze fissato al 22 settembre e il primo release candidate due giorni dopo:

Cronologia delle release

La pagina di preparazione di PHP 8.6 riporta la seguente cronologia per il rilascio:

  • Da Alpha 1 ad Alpha 3: dal 2 al 30 luglio 2026
  • Beta 1 (soft feature freeze): 13 agosto 2026
  • Beta 3: 10 settembre 2026
  • Feature freeze: 22 settembre 2026
  • RC 1: 24 settembre 2026
  • RC 4: 5 novembre 2026
  • GA: 19 novembre 2026

I release manager sono Daniel Scherzer, Matteo Beccati e Joe Ferguson.

Applicazione parziale di funzioni

L'applicazione parziale di funzioni (PFA) consente di chiamare una funzione con alcuni argomenti già valorizzati e ottenere in cambio una closure che accetta quelli restanti. Il placeholder ? indica un singolo argomento da riempire in seguito, mentre ... sostituisce tutti gli argomenti rimanenti:

$makeSlug = str_replace(' ', '-', ?);

$makeSlug('Hello World'); // Hello-World

$titles = array_map(strtolower(?), $titles);

La closure risultante mantiene i nomi, i tipi e i valori predefiniti dei parametri della funzione originale. Gli argomenti forniti vengono valutati al momento della creazione della partial, non quando questa viene chiamata. Una RFC successiva ha stabilito che ogni placeholder ? diventa un parametro obbligatorio della closure, anche se il parametro originale era opzionale.

Una versione precedente di questa proposta era stata respinta nel 2021. La RFC v2 è stata approvata con 33 voti a 0.

La funzione clamp()

La nuova funzione clamp() restituisce il valore se rientra nei limiti, oppure il limite più vicino in caso contrario:

clamp(10, min: 0, max: 100);  // 10
clamp(101, min: 0, max: 100); // 100
clamp(-1, min: 0, max: 100);  // 0

Funziona con qualsiasi tipo confrontabile, incluse le stringhe e gli oggetti DateTime. Passare un $min maggiore di $max genera un ValueError. Sostituisce il diffuso pattern min(max($value, $min), $max), facile da invertire per errore.

Una classe Duration

PHP 8.6 introduce Time\Duration, una classe final readonly che rappresenta una durata di tempo in stile cronometro con precisione al nanosecondo. Dispone di metodi factory per ogni unità, metodi aritmetici e supporto ai confronti:

use Time\Duration;

$oneSecond = Duration::fromSeconds(1);
$halfSecond = $oneSecond->divideBy(2);
$total = $oneSecond->add($halfSecond);

$delay = Duration::fromMilliseconds(100)->multiplyBy(2 ** $attempt);

$total > $delay; // comparison operators work

Le Duration possono anche essere costruite a partire da una stringa di durata ISO 8601. La classe è pensata come tipo condiviso che le funzioni del core e la nuova polling API possono accettare al posto di interi e float sparsi. Consulta la RFC sulla Duration per l'elenco completo dei metodi.

Valori predefiniti per le proprietà readonly

A partire da PHP 8.6, le proprietà readonly possono avere un valore predefinito. Prima di 8.6 questo causava un errore in fase di compilazione, il che rendeva scomodo soddisfare con un valore fisso le proprietà di interfaccia di sola lettura introdotte in PHP 8.4:

final readonly class CreateBooksTable implements Migration
{
public string $name = '2026_01_01_create_books_table';
}

La RFC si limita a rimuovere la restrizione. La semantica readonly rimane invariata, quindi la proprietà non può comunque essere riassegnata dopo l'inizializzazione.

DocComment sui parametri di funzione

I doc comment ora possono essere posizionati direttamente su un parametro, e ReflectionParameter::getDocComment() li restituisce. Questo evita di ripetere il nome del parametro in un tag @param sopra la funzione:

function search(
/** Terms to search for in the database */
string $query,
/** Maximum number of entries to return */
int $limit = 10,
): array {
// ...
}

Gli analizzatori statici e gli IDE possono leggere il commento direttamente dal parametro. Vedi la RFC sui DocComment dei parametri.

Una polling API

Il nuovo namespace Io\Poll offre a PHP un'interfaccia unificata verso i meccanismi di polling della piattaforma: epoll su Linux, kqueue su BSD e macOS, event ports su Solaris e WSAPoll su Windows. Sostituisce stream_select() per chiunque costruisca event loop o runtime async in userland:

use Io\Poll\{Context, Event, StreamPollHandle};

$poll = new Context();
$server = stream_socket_server('tcp://0.0.0.0:8080');
stream_set_blocking($server, false);

$poll->add(new StreamPollHandle($server), [Event::Read], ['type' => 'server']);

while (true) {
foreach ($poll->wait(1) as $watcher) {
if ($watcher->hasTriggered(Event::Read)) {
// accept the connection
}
}
}

La RFC afferma che la motivazione principale è interna, come la gestione dei segnali e i miglioramenti a FPM, con i framework async in userland come pubblico secondario. Vedi la RFC sulla Polling API.

L'enum SortDirection

Un enum globale SortDirection con i case Ascending e Descending è ora integrato. Nulla nel core lo accetta ancora. La RFC lo propone come tipo condiviso affinché le librerie smettano di definirne uno proprio, con i query builder citati come esempio:

$query->orderBy('created_at', SortDirection::Descending);

Gli enum possono implementare __debugInfo()

Agli enum non era consentito definire la maggior parte dei metodi magici quando sono stati introdotti in 8.1. PHP 8.6 rimuove questa restrizione per __debugInfo(), poiché non richiede stato, permettendo così di personalizzare l'output di var_dump():

enum Status: int
{
case Ok = 200;

public function __debugInfo(): array
{
return [__CLASS__ . '::' . $this->name . ' = ' . $this->value];
}
}

Gestione degli errori degli stream

Gli stream ottengono un modello di errore unificato. Una nuova opzione di contesto error_mode permette di scegliere tra gli attuali warning, le eccezioni o il silenzio, e stream_last_errors() restituisce oggetti StreamError strutturati relativi all'ultima operazione:

$context = stream_context_create([
'stream' => ['error_mode' => StreamErrorMode::Exception],
]);

try {
$stream = fopen('/nonexistent/file.txt', 'r', false, $context);
} catch (StreamException $e) {
foreach ($e->getErrors() as $error) {
echo $error->code->name . ': ' . $error->message;
}
}

La RFC sulla gestione degli errori degli stream definisce più di 50 codici di errore semantici in un enum StreamErrorCode.

Novità sull'estensione URI

L'estensione URI introdotta in PHP 8.5 guadagna classi builder, così da poter comporre un URI senza creare oggetti intermedi per ogni componente:

$uri = new Uri\Rfc3986\UriBuilder()
->setScheme('https')
->setHost('example.com')
->setPath('/foo/bar')
->build();

La RFC successiva aggiunge anche i metodi getUriType() e getHostType(), oltre a funzioni di percent-encoding per i singoli componenti dell'URI.

Valori predefiniti sicuri per le sessioni

Tre valori predefiniti delle sessioni in php.ini cambiano per le nuove installazioni:

Impostazione Vecchio valore predefinito Nuovo valore predefinito
session.use_strict_mode 0 1
session.cookie_httponly 0 1
session.cookie_samesite unset Lax

Laravel gestisce i propri cookie di sessione, quindi la maggior parte delle applicazioni non è interessata. Le app che utilizzano le sessioni native di PHP e fanno affidamento sui vecchi valori predefiniti dovrebbero consultare la RFC sui valori predefiniti delle sessioni.

Per saperne di più

Condividi su: LinkedIn

Altri articoli recenti