Uscita del linguaggio di programmazione PHP 8.1

Dopo un anno di sviluppo, è stato presentato il rilascio del linguaggio di programmazione PHP 8.1. Questo nuovo ramo include una serie di nuove funzionalità, insieme a diverse modifiche che interrompono la compatibilità.

Miglioramenti chiave in PHP 8.1:

  • È stata aggiunta la supporto per le enumerazioni, ad esempio ora è possibile utilizzare le seguenti costruzioni: enum Status { case Pending; case Active; case Archived; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • È stata aggiunta la supporto per i thread leggeri, noti come fibers, che consentono di gestire i flussi di esecuzione a basso livello. È previsto il supporto per i fibers nei framework Amphp e ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(‘after suspending’); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume(‘after resuming’);
  • È stata migliorata l'implementazione della cache del codice oggetto (opcache), permettendo il caching delle informazioni sull'ereditarietà delle classi. Questa ottimizzazione ha consentito di aumentare le prestazioni di alcune applicazioni dal 5 all'8%. Tra le altre ottimizzazioni si segnalano il miglioramento dell'operatività del JIT, l'implementazione del supporto JIT per l'architettura ARM64 (AArch64), l'accelerazione nella risoluzione dei nomi, l'ottimizzazione delle librerie timelib ed ext/date, e il miglioramento delle prestazioni nella serializzazione e deserializzazione. In generale, si osserva un incremento delle prestazioni del Symfony Demo del 23,0% e di WordPress del 3,5%.
  • L'operatore di espansione all'interno degli array «…$var», che consente di sostituire array esistenti nella definizione di un nuovo array, è stato ampliato con il supporto per le chiavi stringa (in precedenza erano supportati solo identificatori numerici). Ad esempio, ora è possibile usare 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 delle funzioni come parametro predefinito o negli attributi degli argomenti. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • È stata fornita la possibilità di contrassegnare le proprietà di una classe come accessibili solo in lettura (le informazioni in tali proprietà possono essere scritte solo una volta, dopodiché non saranno più modificabili). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Other'; > Errore: Impossibile modificare la proprietà in sola lettura Post::$title
  • È stata implementata una nuova sintassi per gli oggetti richiamabili (callable) — ora è possibile creare una chiusura chiamando una funzione e passando come argomento il valore «…» (ad es. myFunc(…) invece di Closure::fromCallable('myFunc')): function foo(int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • È stata aggiunta una piena supporto per i tipi di intersezione, che consentono di creare nuovi tipi combinando quelli esistenti. A differenza dei tipi di unione, che definiscono collezioni di due o più tipi, i tipi di intersezione richiedono che siano presenti nell'insieme di riempimento non solo alcuni dei tipi elencati, ma tutti i tipi specificati. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • È stato introdotto un nuovo tipo 'never', che può essere utilizzato per informare gli analizzatori statici che una funzione termina l'esecuzione del programma, ad esempio, lanciando un'eccezione o eseguendo la funzione exit. function dd(mixed $input): never { exit; }
  • È stata proposta una nuova funzione array_is_list, che consente di determinare se le chiavi in un array sono disposte in ordine crescente di valore numerico, iniziando da 0: $list = [«a», «b», «c»]; array_is_list($list); // true $notAList = [1 => «a», 2 => «b», 3 => «c»]; array_is_list($notAList); // false $alsoNotAList = [«a» => «a», «b» => «b», «c» => «c»]; array_is_list($alsoNotAList); // false
  • Per vietare la sovrascrittura delle costanti della classe padre, ora si può utilizzare la parola chiave «final». 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 }
  • Sono state proposte le funzioni fsync e fdatasync per forzare il salvataggio delle modifiche dalla cache del disco. $file = fopen(«sample.txt», «w»); fwrite($file, «Some content»); if (fsync($file)) { echo «Il file è stato persistito con successo su disco.»; } fclose($file);
  • È stata aggiunta la possibilità di utilizzare i prefissi «0o» e «0O» per i numeri ottali, oltre al prefisso «0» precedentemente utilizzato. 016 === 0o16; // true 016 === 0O16; // true
  • È stata proposta una limitazione selettiva dell'uso di $GLOBALS, il che porterà a una rottura della retrocompatibilità, ma consentirà di velocizzare notevolmente le operazioni sugli array. Ad esempio, si sta considerando di vietare la scrittura in $GLOBALS e il passaggio di $GLOBALS per riferimento. L'analisi di 2000 pacchetti ha mostrato che solo 23 di essi sarebbero interessati da questa modifica. Ad esempio, in caso di approvazione della proposta, in 8.1 verrà interrotta la supporto per espressioni come: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • I metodi interni ora devono restituire un tipo corretto. In PHP 8.1 verrà emesso un avviso se il tipo restituito non corrisponde alla dichiarazione della funzione, ma in PHP 9.0 l'avviso sarà sostituito da un errore.
  • Proseguono i lavori di traduzione delle funzioni dall'uso delle risorse alla manipolazione degli oggetti. Le funzioni finfo_* e imap_* sono state convertite in oggetti.
  • È stata dichiarata obsoleta la trasmissione di valori null come argomenti di funzioni interne contrassegnate come non-nullable. In PHP 8.1 l'uso di costrutti come str_contains('string', null) comporterà un avviso, mentre in PHP 9 porterà a un errore.
  • È stata aggiunta la supporto per gli algoritmi di hashing MurmurHash3 e xxHash.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster