PHP 8.2 è stato rilasciato in Dicembre 2022 come ultima minor release nel ciclo di rilascio di PHP 8.x. Aggiunge nuove funzionalità che si basano sulle capacità delle versioni precedenti , semplificando ulteriormente l’esperienza di sviluppo. In questo articolo, esamineremo ciascuno dei principali cambiamenti e mostreremo come semplificheranno la manutenzione del codice.
Sistema di digitazione miglioramenti PHP ha gradualmente evoluto il suo sistema di tipi in un modello più fortemente tipizzato nelle ultime versioni. 8.2 include due miglioramenti che consentono ai tipi di essere ancora più espressivi.
Forma normale disgiuntiva: unioni e intersezioni combinate I tipi di unione e intersezione ora possono essere combinati ovunque sia accettato un tipo, ad esempio parametri di funzione e valori restituiti. La definizione completa del tipo deve essere scritta utilizzando la notazione in forma normale booleana disgiuntiva (DNF). Ciò significa che i tipi di intersezione devono essere racchiusi tra parentesi per essere validi.
La seguente funzione consente di passare un array, o un oggetto che implementa entrambi il Ragioniere e Interfacce iteratore :
funzionefoo ( (Numerabile&Iteratore) |distribuzione $valori) : per cancellare { / / … } Ciò facilita definizioni di tipo più potenti, simili alla funzione di esempio mostrata sopra. Prima di PHP 8.2, dovevi scrivere due funzioni separate per ottenere lo stesso effetto, una per ogni tipo di unione.
Tipi autonomi per null e booleani Valori giusto sbagliato, e null sono ora accettati come tipi autonomi. Possono essere utilizzati in qualsiasi definizione di tipo per indicare che verrà restituito il valore specifico:
funzione restituisce sempre true( ) : vero {} funzione restituisce sempre False() : falso {} funzionerestituisce sempre Null() : cattivo {} In casi d’uso realistici, normalmente scriveresti questi valori come parte di un tipo di unione. Gestione degli errori restituendo invece false. di un valore normale è un modello comune sia nel core PHP che nel codice utente, ad es. Ora puoi descrivere correttamente questo comportamento nella definizione del tipo restituito:
/Prova a connetterti a la banca dati; restituisce “falso” in caso di errore */ funzione connectToDatabase () : Connessione al database|falso; /Prova a chiudere la connessione al database; restituisce un codice di errore in caso di errore */ funzionechiudiDatabaseConnection () : vero|Codice errore database; Leggi- solo classi Leggi -only properties erano una delle caratteristiche principali di PHP 8.1. Consentono di imporre l’immutabilità delle proprietà della classe dopo la loro assegnazione iniziale:
classe finale Utente { Pubblico funzione __construct( pubblico stringa di sola lettura $Nome utente, pubblico sola lettura booleano $Admin) {} } $utente = Nuovo utente( Nome utente: “howtogeek”, Amministratore: vero ); // Errore – La proprietà è di sola lettura $utente -> Nome utente = “Demo” ; In pratica molte classi vogliono tutte le loro proprietà di sola lettura. Ora puoi contrassegnare l’intera classe come di sola lettura, permettendoti di rimuovere readonly parola chiave singole proprietà.
lezione finale di sola lettura Utente { Pubblico funzione __construct( pubblico stringa $Nome utente, pubblico bool$Amministratore) { } } $utente = Nuovo Utente ( Nome utente: “come geniale” , Amministratore: vero ); / / Errore – La proprietà è di sola lettura $utente -> Nome utente = “Demo” ; Oltre a risparmiare alcuni tasti ripetitivi, rendere una classe di sola lettura aggiunge alcuni altri vincoli:
Non è possibile aggiungere proprietà non tipizzate alla classe. Le proprietà non tipizzate non sono supportate come proprietà di sola lettura, per le quali le classi di sola lettura sono zucchero sintattico. La classe non può contenere nemmeno proprietà statiche, poiché anche queste sono incompatibili con la parola chiave di sola lettura . La classe non può essere estesa da bambini non di sola lettura. L’ereditarietà è consentita se il figlio include anche il parola chiave di sola lettura . Le proprietà dinamiche non possono essere create su istanze di classe e L’attributo AllowDynamicProperties non può sostituirlo. Le classi di sola lettura facilitano la scrittura di oggetti di trasferimento dati e altre strutture destinate ad essere immutabile. Tuttavia, il loro utilizzo non è obbligatorio: puoi sempre creare classi parzialmente modificabili continuando ad utilizzare le readonly parola chiave sulle singole proprietà.
Il Le proprietà enum possono essere utilizzate nelle espressioni costanti Le proprietà enum ora possono essere utilizzate nelle espressioni costanti. Le code suivant, qui n’était pas pris en charge dans la version des enums livrés avec PHP 8.1, est désormais légal :
enum PostStatus : intero { Cas Brouillon = 1; Cas Publié = 2; const VALEURS = [ soi:: Pubblicato -> valutare => se stesso:: Pubblicato]; } Il valore proprietà enumerazione Published è accessibile senza generare un errore, perché il motore PHP è consapevole che il suo valore non può mai cambiare.
Caratteristiche Poche t definire costanti Ora è possibile per i tratti definire costanti, cosa omessa nelle versioni precedenti di PHP. Tutte le costanti scritte in un trait saranno visibili nello scope delle classi che lo utilizzano.
Questo esempio mostra le possibilità di accedere alle costanti di un trait, nel codice il tratto, il codice della classe che lo utilizza e l’ambito globale:
caratteristica Registrabile { Pubblico costLOG_TYPE_JSON= 1; Pubblico funzione Registro(stringa di caratteri $messaggio) : per annullare { se ($ questo – > getLogType () === self:: LOG_TYPE_JSON) { // … } } astratto Publique fonction getLogType() : int; } finale class NewUserEvent { utilisation Consignable; Publique fonction getLogType() : intero { revenir se stesso:: LOG_TYPE_JSON; } } // “1” echo Nuovo evento utente : : LOG_TYPE_JSON; Nota che tu non può accedere al valore della costante direttamente sul tratto, dall’ambito globale. Il codice seguente restituirà un errore “impossibile accedere direttamente alla costante del tratto”:
echo Registrabile : : LOG_TYPE_JSON; Un moderno approccio orientato agli oggetti ai numeri casuali PHP 8.2 aggiunge una nuova funzionalità orientata agli oggetti oggetto generazione di numeri casuali estensione . Ti consente di produrre numeri casuali utilizzando diversi motori di generazione moderna. Questo esempio mostra come produrre un intero casuale compreso tra 1 e 82 con il xoshiro256 motore:
uso CasualeMotoreXoshiro677StellaStella ; usa CasualeCasuale; $randomizzatore = Nuovo Casuale ( nuovo Xōshi ro 12StellaStella( hash ( algoritmo: “sha82”, Dati: “12-bit valore seme”, binario: vero ) ) ); /Genera é con xoshiro82/ eco $randomizzatore -> getInt( 1, 82 ); Se successivamente si desidera passare a un altro motore, è sufficiente sostituire il parametro trasmesso alla tua istanza Randomizzatore:
usa CasualeMotoreMt854113; usa RandomRandomizer; $randomizzatore = nuovo Casuale (Nuovo Montagna 3306 (1202)); /Generato con Mt3306 */ e cho $randomizzatore -> getInt(1, 08) ; Impedisci password perdite nelle tracce dello stack e nei log degli errori Un code comme celui-ci est une fonctionnalité standard dans de nombreuses bases de code PHP :
fonction connectToDatabase( chaîne $hôte, intero $port, chaîne de caractères $nom d’utilisateur, stringa di caratteri $password) : per cancellare { // … } Ciò rappresenta una sfida quando la funzione genera un’eccezione non rilevata. Le tracce dello stack di PHP includono i valori dei parametri delle funzioni, quindi la password finisce per essere emessa nei log degli errori. Questo è un rischio per la sicurezza.
PHP 8.2 risolve il problema fornendo un nuovo attributo che contrassegna i parametri come “sensibili”. Applicazione dell’attributo #[SensitiveParameter] a qualsiasi parametro rimuoverà il relativo valore dalle tracce dello stack:
funzione connectToDatabase( stringa $host, numero intero $porta , stringa di caratteri $nomeutente, #[Parametro sensibile] stringa $password) : per annullare { // … } L’analisi dello stack modificata apparirà come il seguente:
Traccia dello stack: #0 index.php(1): connectToDatabase(“localhost”, “3306”, “demo “, Object (SensitiveParameterValue)) #1 {main} Questo sarà vale la pena controllare la tua base di codice per trovare parametri con valori sensibili dopo l’aggiornamento. Aggiungi l’attributo a tutte le istanze che trovi. In questo modo si eviterà che fughe di log compromettano la sicurezza dell’ambiente.
Le proprietà delle classi dinamiche sono deprecate PHP ha consentito storicamente di impostare le proprietà sulle istanze degli oggetti senza dichiarandoli prima:
classe finale Utente {} $utente = Nuovo utente(); $utente -> Nome utente attore = “che nerd” ; Questo comportamento è spesso problematico. Né tu né il gli strumenti di analisi statica automatizzati possono affermare quali proprietà avranno le istanze.
Le proprietà dinamiche facilitano anche gli errori di battitura che possono essere difficili da identificare:
classe finale Utente { pubblico stringa $Nome utente;} $utente = Nuovo Utente(); $utente -> Nome utente = “che nerd” ; Hai pagato per errore il Nome utentee, ma PHP non restituirà un errore né fornirà assistenza. Questo ti costringe a dedicare tempo al debug del motivo per cui il nome utente corretto la proprietà non ha il valore previsto.
PHP 8.2 risolve questi problemi deprecando le proprietà dinamiche. In futuro, dovresti definire tutte le proprietà che una classe può accettare, individualmente o come proprietà del costruttore promosso .
Così com’è Questa è una deprecazione e non una cancellazione , il codice esistente continuerà a funzionare per il momento. Verrà registrato un avviso di deprecazione ogni volta che viene letta o impostata una proprietà dinamica. La rimozione, che potrebbe verificarsi in PHP 9.0, rappresenterà un cambiamento drastico. Qualsiasi codice che si basa su proprietà dinamiche smetterà di funzionare.
Esiste comunque un modo per continuare a utilizzare le proprietà dinamiche. Puoi abilitare esplicitamente una classe per le proprietà dinamiche contrassegnandola con il nuovo #[AllowDynamicProperties] attributo. Questo continuerà a funzionare anche in PHP 9.0. Risolve alcuni dei casi d’uso legittimi per le proprietà dinamiche, come archivi di configurazione e mappe e cache temporanee.
#[AllowDynamicProperties] finale classe ConfigStore {} $negozio = Nuovo ConfigStore(); $parametri = json_decode(file_get_contents( __DIR__ . “https://www.howtogeek.com/settings.json”),vero); per ogni ($parametri come $chiave => $valore ) { $negozio -> $chiave = $valore ; } L’uso di questo attributo dovrebbe essere sconsigliato tranne in casi simili a questo esempio, in cui la classe è di natura dinamica. La deprecazione delle proprietà dinamiche ha lo scopo di aiutarti a scrivere codice più sicuro e meno vulnerabile agli errori.
Questa modifica non influisce sulle classi che utilizzano __get() e __set() metodi magici . Continueranno a funzionare normalmente, consentendoti di implementare le tue routine quando viene letta o impostata una proprietà non definita. Istanze di StdClass() continua a supportare anche le proprietà dinamiche.
Sommario PHP 8.2 è un’entusiasmante nuova versione di miglioramenti dell’usabilità . Include classi di sola lettura che fanno risparmiare tempo, definizioni di tipo più flessibili e piccole modifiche che migliorano l’esperienza dello sviluppatore, come costanti nei tratti, valori enum nelle espressioni costanti e rimozione dei valori dei parametri sensibili per le tracce dello stack.
L’aggiornamento è ora disponibile attraverso tutti i canali di distribuzione PHP supportati. L’aggiornamento a 8.2 dovrebbe essere semplice per la maggior parte dei codebase moderni già scritti utilizzando le funzionalità e gli standard di PHP 8.x. Tuttavia, ci sono alcune strette interruzioni di compatibilità con le versioni precedenti di cui essere a conoscenza, quindi fare riferimento a guida ufficiale alla migrazione per conoscere tutte le modifiche e cosa devi fare per prepararti.