Cosa c'è di nuovo in PHP 8.1?

0
168

PHP 8.1 è stato rilasciato a novembre 2021 come ultima versione secondaria di PHP linguaggio. Aggiunge diverse nuove funzionalità linguistiche insieme ad alcuni miglioramenti minori e miglioramenti delle prestazioni. Ci sono alcune modifiche importanti di cui essere a conoscenza, ma la maggior parte degli aggiornamenti da PHP 8.0 dovrebbe essere semplice.

Nuove funzionalità

Il PHP di quest'anno l'aggiornamento aggiunge diverse nuove funzionalità per migliorare la produttività degli sviluppatori. Ecco cosa potrai utilizzare dopo l'aggiornamento.

Enum

I tipi Enum fanno finalmente parte del linguaggio PHP. Consentono di specificare che un valore deve essere uno di un insieme di costanti predefinite.

Rispetto alle costanti regolari, le enumerazioni forniscono una convalida incorporata quando vengono utilizzate come parametri del metodo e valori restituiti. Possono anche avere valori di supporto e metodi che associano un comportamento extra.

# Classe PHP 8.0 PostStatus { const Bozza = 1; const Pubblicato = 2; }   # PHP 8.0 – Impossibile digitare un suggerimento che il valore # di `$PostStatus` deve essere definito # all'interno di `PostStatus`. classe Post { funzione pubblica __construct( public string $Headline, public int $PostStatus) {} }   # PHP 8.1 enum PostStatus { caso Bozza = 1; caso Pubblicato = 2; }   # PHP 8.1 – Ora è impossibile passare un valore # non valido come stato. classe Post { funzione pubblica __construct( stringa pubblica $Headline, public PostStatus $PostStatus) {} }

Proprietà di sola lettura

La nuova parola chiave di sola lettura contrassegna una proprietà di classe come immutabile. Le proprietà di sola lettura possono essere scritte solo una volta. Il tentativo di modificare il loro valore dopo l'inizializzazione genererà un errore.

Annuncio

Ciò semplifica la creazione di semplici oggetti di valore immutabile. In precedenza era necessario aggiungere metodi ripetitivi a una classe se si desiderava esporre i valori delle proprietà senza consentire la modifica. Ora puoi rendere pubbliche le proprietà senza rischiare mutazioni involontarie.

# PHP 8.0 – Questo diventa rapidamente ripetitivo! classe Post { funzione pubblica __construct( stringa protetta $Titolo) {}   funzione pubblica getHeadline() : stringa { restituisce $this -> Titolo; } }   # Classe PHP 8.1 Post { funzione pubblica __construct( stringa di sola lettura pubblica $Headline) {} }

Tipi di intersezione

Il sistema di tipi di PHP ora comprende le intersezioni. Questi consentono di specificare che un valore deve implementare più interfacce.

Ciò è utile nei casi in cui il codice deve chiamare metodi di istanza definiti da due diverse interfacce. In precedenza era necessario creare una nuova interfaccia che estendesse entrambe quelle desiderate. Questo non era sempre pratico nei casi in cui non potevi modificare la classe di destinazione per implementare la tua nuova interfaccia.

Le intersezioni sono definite combinando due o più tipi con una e commerciale haracter. Aggiungono maggiore flessibilità al sistema dei tipi dopo l'introduzione dei tipi di unione in PHP 8.0. Un avvertimento è che al momento non puoi utilizzare i tipi di intersezione e unione insieme – Countable&Stringable|CustomType è vietato in questa versione.

# Interfaccia PHP 8.0 CountableString estende Countable, Stringable {}   funzione pubblica countAndReport(CountableString $value) : vuoto { echo "$valore: " . conta($valore); }   # PHP 8.1 funzione pubblica countAndReport(Countable&Stringable $value) : vuoto { echo "$valore: " . conta($valore); }

Fibre

Le fibre sono meccanismi per facilitare l'esecuzione simultanea. Semplificano l'implementazione di blocchi di codice ripristinabili che possono essere sospesi da qualsiasi punto dello stack.

L'API Fibers è di livello relativamente basso. Non è previsto che gli sviluppatori degli utenti finali interagiscano con esso su base regolare. Invece, Fibers sarà integrato in librerie che offrono API asincrone e implementazioni di loop di eventi. Sono un sistema di controllo del flusso che consente astrazioni semplificate di livello superiore.

Pubblicità

Le fibre offrono un percorso alle chiamate di funzioni asincrone che sembrano normali operazioni sincrone. Puoi eliminare il boilerplate associato a promesse e callback. Fibers gestisce la sospensione e la ripresa del codice nei punti appropriati, offrendo un'API per le implementazioni di operazioni di blocco e non.

# PHP 8.0 – Un client HTTP basato su promesse $risposta = $httpClient -> richiesta("http://example.com") -> quindi(funzione (Risposta $Risposta) { restituisce $Risposta -> getBody(); }); stampa $risposta;   # PHP 8.1 – Un client HTTP che utilizza Fibers internamente $response = $httpClient -> richiesta("https://example.com"); print $risposta -> getBody();

Callable di prima classe

I callable sono ora cittadini di prima classe nel linguaggio PHP. Ciò significa che puoi assegnare direttamente le funzioni alle variabili, senza utilizzare la vecchia sintassi dell'array o la creazione di chiusure esplicite.

Questa modifica sarà molto utile nei contesti di programmazione funzionale. Passare le funzioni è più semplice e pulito con l'assegnazione diretta delle variabili.

# PHP 8.0 $builtin = Closure::fromCallable("array_filter"); $metodo = [$this, "getData"];   # PHP 8.1 $integrato = filtro_array(…); $metodo = $questo -> getData(…);

La … sostituzione dei parametri della funzione è una parte obbligatoria della sintassi. Questo segnala che vuoi assegnare la funzione alla variabile, invece di chiamare la funzione e assegnarne il valore di ritorno.

Uso di nuovi in ​​inizializzatori

Un'altra nuova caratteristica è la nuova parola chiave negli inizializzatori. Ora puoi utilizzare le istanze degli oggetti come valori di parametro predefiniti:

# Classe PHP 8.0 SendNewsletterAction { Mailer protetto $Mailer; funzione pubblica __construct(?Mailer $Mailer=null) { $questo -> Mailer = $Mailer ?? nuovo SmtpMailer(); } }   # Classe PHP 8.1 SendNewsletterAction { funzione pubblica __construct( protetto readonly Mailer $Mailer=nuovo SmtpMailer()) {} } Annuncio

La nuova parola chiave funzionerà anche con variabili statiche, costanti globali e argomenti di attributo. Offre maggiore flessibilità e comodità quando si desidera un'istanza di oggetto come valore predefinito.

Costanti di classe finale

La parola chiave final è ora supportata per le costanti di classe. Puoi contrassegnare singole costanti come finali senza sigillare l'intera classe. In precedenza le classi figlie erano libere di sovrascrivere il valore delle costanti ereditate dai genitori.

# PHP 8.0 – Non è possibile disabilitarlo senza # rendere l'intera classe `final` class DemoClass { public const DemoConstant = 1; } class ChildClass estende DemoClass { public const DemoConstant = 2; }   # PHP 8.1 – Solo la costante può essere `final`. class DemoClass { const pubblico finale DemoConstant = 1; } class ChildClass estende DemoClass { //Genera un errore fatale public const DemoConstant = 2; }

Altri

Oltre agli elementi importanti elencati sopra, PHP 8.1 aggiunge anche alcune funzionalità utili che aiutano a rendere il codice più auto-documentante. È possibile scrivere numeri ottali con una notazione esplicita, ad esempio 0o14, e utilizzare il nuovo tipo di non ritorno per indicare funzioni che genereranno un'eccezione o usciranno dallo script corrente. Questo aiuta a informare il rilevamento del codice morto nel software di analisi statica.

Ci sono alcune nuove funzioni nella libreria standard. array_is_list() consente di verificare se un array è un elenco ([“foo”, “bar”]) o associativo ([“foo” => “bar”]), fornendo un'implementazione integrata per una funzione che 8217; si trova comunemente nel codice della zona utente esistente. fsync() e fdatasync() consentono di sincronizzare le modifiche al puntatore del file sul supporto di memorizzazione sottostante. È stato aggiunto anche il supporto per il sodio per gli algoritmi di hashing XChaCha20 e Ristretto255.

Infine, questa versione offre la prospettiva di miglioramenti delle prestazioni. Le ottimizzazioni che includono una cache di ereditarietà delle classi potrebbero fornire un aumento delle prestazioni gratuito fino all'8%. Questo sarebbe più evidente in codebase fortemente orientate agli oggetti con molte relazioni padre-figlio. PHP ora memorizzerà nella cache questi collegamenti in modo che non li ricostruisca continuamente.

Modifiche incompatibili con le versioni precedenti

Come un aumento della versione minore, ci sono alcune modifiche sostanziali e deprecazioni di cui essere a conoscenza prima di eseguire l'aggiornamento. Ecco quelli che più probabilmente rappresentano un problema nel tuo codebase:

  • Non è più consentito sovrascrivere l'array $_GLOBALS. Puoi ancora scrivere su singole chiavi ma non puoi riassegnare $_GLOBALS stesso.
  • Se estendi una classe incorporata, i tuoi metodi sovrascritti devono dichiarare un tipo restituito compatibile con quello originale. Se specifichi un tipo incompatibile, verrà emesso un avviso di deprecazione. Un attributo #[ReturnTypeWillChange] è attualmente supportato come un modo per evitarlo per le librerie che devono supportare più versioni PHP.
  • Il passaggio di parametri null a non nullable delle funzioni interne è stato deprecato. Ciò era consentito in precedenza, ma non era coerente con l'imposizione di typehint per le funzioni create dall'utente.
  • I cast impliciti da int a float sono stati deprecati – questo ha effetto su scenari come $array[10.1], in cui la mantissa andrà persa poiché gli array devono avere chiavi intere.
  • Come parte del lavoro in corso di PHP per rimuovere i tipi di risorse, diversi gruppi di funzioni ora lavorano con nuovi oggetti anziché con risorse. Queste modifiche si applicano alle API FileInfo, FTP, IMAP, LDAP, PgSQL e PSpell.
  • Le funzioni che funzionano con le entità HTML come htmlspecialchars() e htmlentities() ora evitano gli apostrofi per impostazione predefinita, quindi diventeranno '.
  • La chiamata diretta a metodi statici sui tratti è deprecata; dovresti chiamare il metodo su una classe che usa invece il tratto.

Altre rimozioni e deprecazioni interessano le singole API, tra cui PDO, MySQLi e Standard. Dovresti rivedere l'intera guida alla migrazione prima di aggiornare il tuo progetto.

Pubblicità

Presi insieme, i cambiamenti di questo ciclo sono abbastanza innocui. Le basi di codice che erano già conformi alle moderne best practice PHP non dovrebbero riscontrare troppi problemi quando si passa alla 8.1. Framework popolari inclusi Symfony e Laravel supportano già PHP 8.1.

Conclusione

PHP 8.1 aggiunge molte nuove funzionalità che rendono l'esperienza di sviluppo più semplice e snella. Gli enum sono stati a lungo un pezzo mancante del sistema di tipi, mentre le proprietà di sola lettura e i nuovi inizializzatori renderanno più veloce la scrittura di nuove classi.

Le fibre aiutano a rendere PHP asincrono più accessibile mentre i callable di prima classe facilitano la funzione semplificata riferimenti quando si praticano tecniche di programmazione funzionale. Tutti questi cambiamenti fanno maturare ulteriormente PHP come un linguaggio flessibile che offre forti garanzie di sicurezza per il tuo codice pur essendo semplice da utilizzare.