Cosa c'è di nuovo in PHP 8.2?

PHP 8.2 è stato rilasciato nel dicembre 2022 come ultima versione minore 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 ciascuna delle principali modifiche e mostreremo come semplificheranno la manutenzione del tuo codice.

Miglioramenti del sistema dei tipi

PHP ha gradualmente evoluto il suo sistema dei tipi verso 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

< p>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 disgiuntiva booleana (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 entrambe le interfacce Countable e Iterator:

funzione foo((Numerabile&Iteratore)|array $values) : void {< /strong> //… }

Ciò facilita definizioni di tipo più potenti, simili alla funzione di esempio mostrata sopra. Prima di PHP 8.2, avresti dovuto scrivere due funzioni separate per ottenere lo stesso effetto, una per ciascuno dei tipi nell'unione.

Tipi autonomi per null e booleani

I valori true, false 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 alwaysReturnsTrue() : vero{}   funzione restituisce sempreFalse() : false {}   funzione sempreRestituisceNull() :null {}

In realistico casi d'uso, normalmente scriverai questi valori come parte di un tipo di unione. Gestire gli errori restituendo false invece di un valore normale è un modello comune sia nel core PHP che nel codice userland, ad esempio. Ora puoi descrivere correttamente questo comportamento nella definizione del tipo restituito:

/** * Tenta di connettersi al database; restituisce `false` in caso di errore */ funzione connectToDatabase( ) : Connessione al database|false;   /** * Tenta di chiudere la connessione al database; restituisce un codice di errore in caso di errore */ function closeDatabaseConnection() : vero |DatabaseErrorCode;

Classi di sola lettura

Le proprietà di sola lettura erano una delle caratteristiche principali di PHP 8.1. Consentono di imporre l'immutabilità per le proprietà delle classi dopo la loro assegnazione iniziale:

final class User {   pubblicafunzione __construct(   public stringa di sola lettura $Username,   public readonly bool $Admin) {}   }   $utente= nuovo Utente( Nome utente: "howtogeek", amministratore: true );   //Errore – La proprietà è di sola lettura $user ->Nome utente = "Demo" ;

In pratica, molte classi vogliono che tutte le loro proprietà siano di sola lettura. Ora puoi contrassegnare l'intera classe come di sola lettura, il che ti consente di eliminare la parola chiave di sola lettura dalle singole proprietà.

readonly finale classe Utente {   pubblica funzione__construct(   public stringa $Username,   public bool $Admin) {}   }   $user = nuovoUtente( Nome utente: "howtogeek", amministratore: true )< /strong>;   //Errore – La proprietà è di sola lettura $user -> < strong class="me1">Nome utente = "Demo";

Oltre a risparmiare parte della digitazione ripetitiva, rendere una classe di sola lettura aggiunge alcuni altri vincoli:

  • Non puoi 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 uno zucchero sintattico.
  • La classe non può contenere nemmeno proprietà statiche, poiché sono analogamente incompatibili con la parola chiave di sola lettura.
  • < Li>La classe non può essere estesa da bambini non di sola lettura. L'ereditarietà è consentita se il figlio include anche la parola chiave readonly.

  • Non è possibile creare proprietà dinamiche sulle istanze della classe e l'attributo AllowDynamicProperties non può sovrascriverlo.

Le classi di sola lettura rendono più conveniente scrivere oggetti di trasferimento dati e altre strutture che devono essere immutabili. Il loro uso non è però obbligatorio: puoi comunque creare classi parzialmente mutabili continuando a utilizzare la parola chiave readonly sulle singole proprietà.

Le proprietà Enum possono essere utilizzate nelle espressioni costanti

Le proprietà Enum ora possono essere utilizzate nelle espressioni costanti. Il seguente codice, che non era supportato nella versione di enum fornita con PHP 8.1, è ora legale:

enum PostStatus : int {   custodiaBozza = 1;   caso Pubblicato = 2;< /strong>   const VALORI = [self::Pubblicato -> valore => self::Pubblicato];   }

Si accede alla proprietà value del caso Published dell'enumerazione senza generare un errore, perché il motore PHP è consapevole che il suo valore può non cambiano mai.

I tratti possono definire costanti

Ora è possibile per i tratti definire costanti, qualcosa che era stato omesso dalle precedenti versioni di PHP. Tutte le costanti scritte all'interno di un tratto saranno visibili nell'ambito delle classi che lo utilizzano.

Questo esempio dimostra le possibilità di accedere alle costanti di un tratto, all'interno del codice del tratto , il codice della classe che lo utilizza e dall'ambito globale:

trait Loggable {   public const LOG_TYPE_JSON = 1;   pubblica funzione registro&#40 ;stringa $messaggio) : void { se ($this -> getLogType () === self::LOG_TYPE_JSON)< /strong> { //… } }   abstract public function getLogType&# 40;) : int; &nbsp ; }     finale classe NewUserEvent {   usa Registrabile;  pubblica funzione getLogType() : int { ritorno self::LOG_TYPE_JSON ; }   }  //"1" echo NewUserEvent::LOG_TYPE_JSON;

Nota che non puoi accedere al valore della costante direttamente sul tratto, dall'ambito globale. Il codice seguente genererà un messaggio “impossibile accedere direttamente al tratto” errore:

echo Registrabile::LOG_TYPE_JSON;

Un approccio moderno orientato agli oggetti ai numeri casuali

PHP 8.2 aggiunge una nuova estensione per la generazione di numeri casuali orientata agli oggetti. Ti consente di produrre numeri casuali utilizzando diversi motori di generazione moderna. Questo esempio mostra come produrre un numero intero casuale compreso tra 1 e 100 con il motore xoshiro256**:

use RandomEngineXoshiro256StarStar; usa RandomRandomizer;   $randomizer = nuovo Randomizer& #40; nuovo Xoshiro256StarStar( hash ( algoritmo: "sha256", dati: "valore di inizializzazione a 256 bit", binario: vero ) ) );   /** Generato con xoshiro256** */ echo $randomizer-> getInt(1, 100)< strong class="sy0">;

Se successivamente desideri passare a un motore diverso, devi solo sostituire il parametro passato alla tua istanza Randomizer:

usa RandomEngineMt19937; usa RandomRandomizer;   $randomizer = nuovo Randomizer& #40;nuovo Mt19937(1234 ));   /** Generato con Mt19937 */echo $randomizer -> getInt(1, 100);

Previene la perdita di password nelle tracce dello stack e nei log degli errori

Un codice come il seguente è una funzionalità standard in molti codebase PHP:

function connectToDatabase( string $host, int $port,< /strong> stringa $nomeutente, stringa $password) : void {//… }

Ciò rappresenta una sfida quando la funzione genera un'eccezione non rilevata. Le tracce dello stack di PHP includono i valori dei parametri della funzione, 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.” L'applicazione dell'attributo #[SensitiveParameter] a qualsiasi parametro ne eliminerà il valore dalle tracce dello stack:

function connectToDatabase(< /strong> string $host, int $port, stringa $username, #[SensitiveParameter] stringa $password) :void { //… }

La traccia dello stack modificata sarà simile alla seguente:

Traccia dello stack: #0 index.php(1): connectToDatabase(“localhost”, “3306”, “demo”, Object(SensitiveParameterValue)) # 1 {principale}

Vale la pena controllare la base di codice per trovare parametri con valori sensibili dopo l'aggiornamento. Aggiungi l'attributo a tutte le istanze che trovi. Ciò contribuirà a impedire che i log trapelati compromettano la sicurezza del tuo ambiente.

Le proprietà delle classi dinamiche sono state deprecate

PHP ti ha storicamente permesso di impostare proprietà su istanze di oggetti senza prima dichiararle:

final class User {}   $user = nuovo Utente(); $utente -> Nome utente = "howtogeek";

Questo comportamento è spesso problematico. Né tu né gli strumenti di analisi statica automatizzati potete affermare quali proprietà avranno le istanze.

Le proprietà dinamiche facilitano anche gli errori di battitura che possono essere difficili da individuare:

finale class utente {   public stringa $Username;   }   $user = nuovo Utente& #40;); $user-> Nome utente = &quot ;howtogeek";

Hai erroneamente impostato la proprietà Usernamee, ma PHP non genererà un errore né fornirà alcun aiuto. Ciò ti fa perdere tempo a eseguire il debug del motivo per cui la proprietà Username corretta non ha il valore che ti aspetti.

PHP 8.2 risolve questi problemi deprecando le proprietà dinamiche. Andando avanti, dovresti definire tutte le proprietà che una classe può accettare, individualmente o come proprietà del costruttore promosso.

Poiché si tratta di una deprecazione e non di una rimozione, il codice esistente continuerà a funzionare per ora. Verrà registrato un avviso di deprecazione ogni volta che viene letta o impostata una proprietà dinamica. La rimozione, che potrebbe avvenire in PHP 9.0, sarà un cambiamento decisivo. Qualsiasi codice che si basa su proprietà dinamiche smetterà di funzionare.

Tuttavia, esiste un modo per continuare a utilizzare le proprietà dinamiche. Puoi acconsentire esplicitamente a una classe per le proprietà dinamiche contrassegnandola con il nuovo attributo #[AllowDynamicProperties]. 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] final class ConfigStore {}   $store = nuovo ConfigStore(< strong class="br0">); $settings = json_decode(file_get_contents(__DIR__ . "/settings.json"), vero );   foreach ($settings as $key => $value< strong class="br0">) {$store -> $key = $value; } < p>L'uso di questo attributo dovrebbe essere scoraggiato tranne in casi simili a questo esempio, in cui la classe è dinamica per natura. La deprecazione delle proprietà dinamiche ha lo scopo di aiutarti a scrivere codice più sicuro che sia meno vulnerabile agli errori.

Questa modifica non ha effetto sulle classi che utilizzano i metodi magici __get() e __set(). Continueranno a funzionare normalmente, consentendoti di implementare le tue routine quando viene letta o impostata una proprietà non definita. Anche le istanze di stdClass() continuano a supportare le proprietà dinamiche.

Riepilogo

PHP 8.2 è una nuova entusiasmante versione di miglioramenti dell'usabilità. Include classi di sola lettura che fanno risparmiare tempo, definizioni di tipo più flessibili e piccoli aggiustamenti che migliorano l'esperienza dello sviluppatore, come costanti nei tratti, valori enum nelle espressioni costanti e redazione di valori di parametri sensibili per le tracce dello stack.

L'aggiornamento è ora disponibile attraverso tutti i canali di distribuzione PHP supportati. Il passaggio alla versione 8.2 dovrebbe essere semplice per la maggior parte delle basi di codice moderne che sono già state scritte 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 fai riferimento alla guida ufficiale alla migrazione per conoscere tutte le modifiche e cosa devi fare per prepararti.

LEGGI SUCCESSIVO

    < li>› Dovresti abilitare “Protezione avanzata dei dati” per iCloud su iPhone?
  • › L'hardware mesh Wi-Fi 7 incredibilmente veloce arriva da Qualcomm
  • › T-Mobile sta aumentando la velocità del 5G per 260 milioni di persone
  • › Non c'è tempo per leggere? Trasforma gli articoli Web in episodi di podcast
  • › Come rimuovere il blocco di attivazione su un Mac
  • › Apple ha un ultimo grande aggiornamento per iPhone, iPad e Mac per il 2022

Posted

in

by

Tags: