Dopo un anno di sviluppo, è stato pubblicato il rilascio del linguaggio di programmazione PHP 8.5. Questa nuova versione include una serie di nuove funzionalità e diversi cambiamenti che compromettono la compatibilità.
Modifiche chiave in PHP 8.5 (1, 2, 3):
- È stato aggiunto l'operatore «|>» (pipe), che consente di passare valori da una funzione all'altra senza utilizzare assegnazioni e variabili intermedie, impiegando il risultato dell'esecuzione di una funzione come parametro per un'altra. Se la funzione ha un argomento, il parametro per il passaggio del valore è selezionato attraverso l'indicazione «…», mentre se la funzione ha più argomenti, la sostituzione avviene tramite chiusure. Ad esempio, il seguente codice $output = $input |> trim(…) |> fn (string $string) => str_replace(' ', '-', $string) |> fn (string $string) => str_replace(['.', '/', '…'], '', $string) |> strtolower(…); è equivalente a $temp = trim($input); $temp = str_replace(' ', '-', $temp); $temp = str_replace(['.', '/', '…'], '', $temp); $output = strtolower($temp); oppure $output = strtolower( str_replace(['.', '/', '…'], '', str_replace(' ', '-', trim($input) ) ) );
- È stata introdotta la possibilità di assegnare nuovi valori agli oggetti clonati durante il loro processo di clonazione, passando un array associativo alla funzione clone(). public function withTitle(string $title): self { return clone($this, [ 'title' => $title, ]); }
- È stato aggiunto l'attributo «#[NoDiscard]», che può essere utilizzato per contrassegnare le funzioni i cui valori di ritorno devono sempre essere utilizzati. Se il valore restituito da una funzione simile viene ignorato, l'interprete emetterà un avviso. Per bypassare il controllo, è possibile utilizzare la chiamata con un cast in tipo void. #[NoDiscard('devi usare questo valore di ritorno.')] function foo(): string { return 'hi'; } foo(); // emette avviso (void) foo(); // Ok $string = foo(); // Ok
- È consentito l'uso di chiusure (closures) e oggetti chiamabili di prima classe (first-class callables) in espressioni costanti, in cui era precedentemente consentito specificare valori immutabili calcolati al momento della compilazione. Ad esempio, ora è possibile specificare chiusure negli attributi, nei valori predefiniti e nelle costanti. Le chiusure utilizzate in questo modo devono sempre essere contrassegnate con la parola chiave «static» e non possono accedere a variabili esterne tramite l'espressione «use». #[SkipDiscovery(static function (Container $container): bool { return ! $container->get(Application::class) instanceof ConsoleApplication; })]
- Quando vengono visualizzati errori fatali, ora viene allegato uno stack trace (backtrace) ai messaggi di errore.
- Sono state aggiunte le funzioni array_first() e array_last(), che restituiscono il primo e l'ultimo elemento di un array. Ad esempio, invece di $first = $array[array_key_first($array)] ?? null; ora si può scrivere $first = array_first($array);
- È stato aggiunto un modulo URI, che fornisce un'API semplificata per l'analisi degli URL. L'analisi avviene tramite le librerie uriparser e lexbor. use Uri\Rfc3986\Uri; $uri = new Uri(‘https://opennet.me/64290’); $uri->getHost(); // opennet.me $uri->getScheme(); // https://
- È stato implementato l'attributo «#[DelayedTargetValidation]», che consente di spostare il controllo degli attributi, come «#[Override]», dalla fase di compilazione a quella di esecuzione. #[DelayedTargetValidation] #[Override] public const NAME = ‘Child’;
- Sono state aggiunte le funzioni get_error_handler() e get_exception_handler() per definire le funzioni con gestori di errori e eccezioni.
- Nel modulo Curl è stata implementata la funzione curl_share_init_persistent(), che consente di condividere i descrittori durante la gestione di diverse richieste.
- Nel modulo Exif è stato aggiunto il supporto per immagini nei formati HEIF e HEIC.
- Sono stati dichiarati obsoleti: la sintassi non standard di casting dei nomi dei tipi (ad esempio, «(integer)» invece di «(int)»); l'uso di backtick (`) per chiamare comandi invece di shell_exec(); le dichiarazioni ripetute delle costanti; l'uso del punto e virgola invece dei due punti per terminare le istruzioni case; indicare null invece di una stringa vuota nei array o nella funzione array_key_exists(). È stata rimossa dal file ini la configurazione «disabled_classes».
Fonte: opennet.ru
