Rilascio del linguaggio di programmazione PHP 8.1

Dopo un anno di sviluppo è stata presentata la versione del linguaggio di programmazione PHP 8.1. Il nuovo ramo include una serie di nuove funzionalità, oltre a diverse modifiche che interrompono la compatibilità.

Miglioramenti chiave in PHP 8.1:

  • Aggiunto il supporto per le enumerazioni, ad esempio, ora puoi utilizzare i seguenti costrutti: enum Status { case Pending; caso Attivo; caso archiviato; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Aggiunto il supporto per thread leggeri chiamati Fibers, che consentono di gestire i thread di esecuzione a basso livello. È prevista l'aggiunta del supporto Fiber ai framework Amphp e ReactPHP. $fibra = new Fiber(funzione (): void { $valueAfterResuming = Fiber::suspend('dopo la sospensione'); // … }); $valueAfterSuspending = $fibra->start(); $fibra->resume('dopo la ripresa');
  • L'implementazione della cache del codice oggetto (opcache) è stata migliorata, rendendo possibile memorizzare nella cache le informazioni sull'ereditarietà delle classi. L'ottimizzazione ha permesso di aumentare le prestazioni di alcune applicazioni del 5-8%. Altre ottimizzazioni includono l'ottimizzazione del funzionamento JIT, l'implementazione del supporto JIT per l'architettura ARM64 (AArch64), l'accelerazione della risoluzione dei nomi, l'ottimizzazione delle librerie timelib e ext/date, aumento delle prestazioni di serializzazione e deserializzazione, ottimizzazione di get_declared_classes(), esplode() , funzione strtr(), strnatcmp(), dechex(). In generale, si riscontra un aumento delle prestazioni del 23.0% per Symfony Demo e del 3.5% per WordPress.
  • L'operatore di spacchettamento all'interno degli array "...$var", che consente la sostituzione degli array esistenti quando si definisce un nuovo array, è stato esteso per supportare le chiavi stringa (in precedenza erano supportati solo gli identificatori digitali). Ad esempio, ora puoi utilizzare nel codice: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • È consentito utilizzare la parola chiave "new" negli inizializzatori, ad esempio nelle definizioni di funzioni come parametro predefinito o negli attributi degli argomenti. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • È possibile contrassegnare le proprietà della classe per l'accesso in sola lettura (le informazioni in tali proprietà possono essere scritte solo una volta, dopodiché non saranno disponibili per la modifica). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Titolo', /* … */); $post->titolo = 'Altro'; > Errore: impossibile modificare la proprietà di sola lettura Post::$title
  • È stata implementata una nuova sintassi per gli oggetti richiamabili: ora è possibile formare una chiusura chiamando una funzione e passandole il valore "..." come argomento (ad esempio myFunc(...) invece di Closure::fromCallable('myFunc ')): funzione foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Aggiunto supporto completo per i tipi di intersezione, consentendo di creare nuovi tipi combinando quelli esistenti. A differenza dei tipi di unione, che definiscono raccolte di due o più tipi, i tipi di intersezione richiedono la presenza non di nessuno dei tipi elencati, ma di tutti i tipi specificati nel set da riempire. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Esiste un nuovo tipo "never" che può essere utilizzato per informare gli analizzatori statici che una funzione terminerà l'esecuzione del programma, ad esempio lanciando un'eccezione o eseguendo la funzione di uscita. funzione dd(mixed $input): mai { exit; }
  • È stata proposta una nuova funzione array_is_list, che permette di determinare che le chiavi dell'array siano disposte in ordine crescente di valori numerici, a partire da 0: $list = [“a”, “b”, “c”]; array_è_lista($lista); // vero $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notALista); // false $ancheNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($ancheNotAList); // falso
  • Ora puoi utilizzare la parola chiave "final" per impedire che le costanti della classe genitore vengano sovrascritte. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Errore fatale: Bar::X non può sovrascrivere la costante finale Foo::X }
  • Le funzioni fsync e fdatasync vengono proposte per forzare il salvataggio delle modifiche dalla cache del disco. $file = fopen("esempio.txt", "w"); fwrite($file, "Alcuni contenuti"); if (fsync($file)) { echo "Il file è stato persistente con successo sul disco."; } fclose($file);
  • Aggiunta la possibilità di utilizzare i prefissi "0o" e "0O" per i numeri ottali, oltre al prefisso "0" precedentemente utilizzato. 016 === 0o16; // vero 016 === 0O16; // VERO
  • Si propone di limitare selettivamente l'uso di $GLOBALS, il che porterà a una violazione della compatibilità con le versioni precedenti, ma consentirà di accelerare notevolmente le operazioni con gli array. Ad esempio, si sta valutando la possibilità di disabilitare la scrittura su $GLOBALS e di passare $GLOBALS tramite puntatore. Un'analisi di 2000 pacchetti ha dimostrato che solo 23 di essi sarebbero interessati da questo cambiamento. Ad esempio, se la proposta viene approvata, 8.1 non supporterà più espressioni come: $GLOBALS = []; $GLOBALI += []; $GLOBALI =& $x; $x =& $GLOBALI; non impostato($GLOBALS); per_rif($GLOBALS);
  • I metodi interni ora dovrebbero restituire il tipo corretto. In PHP 8.1, restituire un tipo che non corrisponde alla dichiarazione della funzione produrrà un avviso, ma in PHP 9.0 l'avviso verrà sostituito con un errore.
  • È continuato il lavoro sul trasferimento delle funzioni dall'utilizzo delle risorse alla manipolazione degli oggetti. Le funzioni finfo_* e imap_* sono state trasferite agli oggetti.
  • Il passaggio di valori nulli come argomenti a funzioni interne contrassegnate come non nullable è stato deprecato. In PHP 8.1, l'utilizzo di costrutti come str_contains("string", null) porterà ad un avviso e in PHP 9 ad un errore.
  • Aggiunto il supporto per gli algoritmi di hashing MurmurHash3 e xxHash.

Fonte: opennet.ru

Aggiungi un commento