Dopo un anno di sviluppo, è stato presentato il rilascio del linguaggio di programmazione PHP 8.2. La nuova versione include una serie di nuove funzionalità, oltre a diversi cambiamenti che rompono la compatibilità.
Miglioramenti chiave in PHP 8.2:
- È stata aggiunta la possibilità di contrassegnare una classe come disponibile solo in lettura. Le proprietà di tali classi possono essere assegnate una sola volta, dopo di che non saranno accessibili per modifiche. In precedenza, solo singole proprietà di classe potevano essere contrassegnate come di sola lettura, mentre ora è possibile attivare questa modalità per tutte le proprietà della classe. L'impostazione del flag «readonly» a livello di classe blocca anche l'aggiunta dinamica di proprietà alla classe. readonly class Post { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* … */); $post->unknown = 'wrong'; // Errore: Impossibile creare una proprietà dinamica Post::$unknown
- Sono stati aggiunti tipi distinti "true", "false" e "null", che possono assumere solo un valore valido e possono essere utilizzati, ad esempio, per restituire una funzione che indica il completamento con errore o un valore vuoto. In precedenza, "true", "false" e "null" potevano essere utilizzati solo in combinazione con altri tipi (ad esempio, "string|false"), mentre ora possono essere applicati separatamente: function alwaysFalse(): false { return false; }
- È stata fornita la possibilità di filtrare i parametri riservati nei dati di tracciamento dello stack, visualizzati durante un errore. L'omissione di determinate informazioni può essere necessaria quando i dettagli sugli errori generati vengono inviati automaticamente a servizi esterni che monitorano i problemi e informano i programmatori. Ad esempio, è possibile escludere dai tracciamenti i parametri che includono nomi utente, password e variabili di ambiente. function test( $foo, #[\SensitiveParameter] $password, $baz ) { throw new Exception('Errore'); } test('foo', 'password', 'baz'); Errore fatale: eccezione non catturata: Errore in test.php:8 Traccia dello stack: #0 test.php(11): test('foo', Object(SensitiveParameterValue), 'baz') #1 {main} lanciato in test.php alla riga 8
- È consentita la definizione di costanti nei trait (un meccanismo per il riutilizzo del codice). L'accesso alle costanti definite in un trait può essere effettuato attraverso la classe che utilizza il trait (ma non attraverso il nome del trait). trait Foo { public const CONSTANT = 1; public function bar(): int { return self::CONSTANT; // Errore fatale } } class Bar { use Foo; } var_dump(Bar::CONSTANT); // 1
- Добавлена возможность задания типов в дизъюнктивной нормальной форме (DNF, Disjunctive Normal Form), позволяющей совместить объединение типов (коллекции из двух и более типов) и пересечение типов (типы, значения которых подпадают одновременно под несколько типов). class Foo { public function bar((A&B)|null $entity) { if ($entity === null) { return null; } return $entity; } }
- È stata proposta una nuova estensione "Random" con funzioni e classi per la generazione di numeri e sequenze pseudo-casuali. Il modulo fornisce un'interfaccia orientata agli oggetti, permette di scegliere diversi motori per la generazione di numeri pseudo-casuali, inclusi quelli adatti all'uso nella crittografia, e fornisce funzioni di supporto, come il mescolamento casuale di array e stringhe, la selezione di chiavi casuali di un array e l'uso simultaneo di più generatori con il proprio stato indipendente. $rng = $is_production ? new Random\Engine\Secure() : new Random\Engine\Mt19937(1234); $randomizer = new Random\Randomizer($rng); $randomizer->shuffleString('foobar');
- È stata implementata la trasformazione della registrazione dei caratteri indipendente dalla località. Funzioni come strtolower() e strtoupper() ora trasformano sempre i caratteri ASCII nel loro formato maiuscolo o minuscolo quando si imposta la località su «C».
- Sono state aggiunte nuove funzioni: mysqli_execute_query, curl_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, sodium_crypto_stream_xchacha20_xor_ic, openssl_cipher_key_length.
- Sono stati aggiunti nuovi metodi: mysqli::execute_query, ZipArchive::getStreamIndex, ZipArchive::getStreamName, ZipArchive::clearError, ReflectionFunction::isAnonymous, ReflectionMethod::hasPrototype.
- È stata dichiarata obsoleta la possibilità di creare dinamicamente proprietà in una classe. In PHP 9.0, l'accesso a proprietà non definite inizialmente nella classe causerà un errore (ErrorException). Le classi che forniscono i metodi __get e __set per creare proprietà, o le proprietà dinamiche in stdClass continueranno a funzionare senza modifiche; la supporto per l'accesso implicito a proprietà inesistenti sarà rimosso per proteggere gli sviluppatori da errori nascosti. Per mantenere funzionante il codice vecchio, è stato proposto l'attributo «#[AllowDynamicProperties]», che consente l'uso di proprietà dinamiche.
- È stata dichiarata obsoleta la possibilità di inserire valori variabili nelle stringhe utilizzando le espressioni «${var}» e ${(var)}». È stata mantenuta la supporto per le sostituzioni comunemente usate «{$var}» e «$var». Per esempio: «Hello {$world}»; OK «Hello $world»; OK «Hello ${world}»; Obsoleto: L'uso di ${} nelle stringhe è deprecato.
- Sono stati dichiarati obsoleti oggetti richiamabili (callable) parzialmente supportati, che possono essere invocati tramite «call_user_func($callable)», ma non supportano la chiamata nella forma «$callable()»: «self::method» «parent::method» «static::method» [«self», «method»] [«parent», «method»] [«static», «method»] [«Foo», «Bar::method»] [new Foo, «Bar::method»]
- È stata aggiunta nella configurazione la direttiva error_log_mode, che consente di definire la modalità di accesso al log degli errori.
Fonte: opennet.ru
