Dopo un anno di sviluppo, è stato presentato il rilascio del linguaggio di programmazione PHP 8.3. Questo nuovo ramo include una serie di nuove funzionalità e diverse modifiche che rompono la compatibilità.
Modifiche principali in PHP 8.3:
- Durante la clonazione delle classi è stata introdotta la possibilità di ri-inizializzare le proprietà contrassegnate con l'attributo «readonly». La sovrascrittura delle proprietà readonly è consentita solo all'interno della funzione «__clone»: readonly class Post { public function __construct( public DateTime $createdAt, ) {} public function __clone() { $this->createdAt = new DateTime(); // consentito, anche se la proprietà «createdAt» è accessibile in modalità sola lettura. } }
- È stata introdotta la possibilità di utilizzare costanti con indicazione del tipo in classi, interfacce ed enumerazioni: class Foo { const string BAR = 'baz'; }
- È stato aggiunto il supporto per l'attributo «#[Override]», che consente allo sviluppatore di informare l'interprete che il metodo contrassegnato sovrascrive un metodo padre. Se la sovrascrittura non avviene, l'interprete genererà un errore.
- È stata modificata la gestione dei valori negativi come indice degli array. Ad esempio, quando si aggiunge un elemento con indice "-5" a un array vuoto e successivamente un altro elemento, prima il secondo veniva salvato con indice "0"; a partire dalla versione PHP 8.3, verrà salvato con indice "-4". $array = []; $array[-5] = 'a'; $array[] = 'b'; var_export($array); // Era array (-5 => 'a', 0 => 'b') // Ora è array (-5 => 'a', -4 => 'b')
- È stata aggiunta la possibilità di creare classi anonime in modalità sola lettura: $class = new readonly class { public function __construct( public string $foo = 'bar', ) {} };
- È stata aggiunta la funzione json_validate() per verificare rapidamente se una stringa è conforme al formato JSON senza eseguire operazioni di decodifica. json_validate(string $json, int $depth = 512, int $flags = 0): bool
- Nella classe Randomizer, che fornisce un'API di alto livello per la generazione di numeri e sequenze pseudocasuali, sono stati aggiunti nuovi metodi: getBytesFromString per creare una stringa di dimensioni specificate che utilizza casualmente i caratteri presenti in un'altra stringa; getFloat e nextFloat per generare un numero casuale in virgola mobile che rientra nell'intervallo specificato.
- È stata aggiunta la possibilità di estrarre costanti utilizzando la sintassi delle classi dinamiche: class Foo { const BAR = 'bar'; } $name = 'BAR'; // In precedenza, per estrarre la costante BAR era necessario chiamare constant(Foo::class . '::' . $name); // Ora è sufficiente indicare Foo::{$name};
- È stata introdotta la generazione di eccezioni separate (DateMalformedIntervalStringException, DateInvalidOperationException, DateRangeError) in caso di problemi nelle operazioni con date e orari.
- Migliorata la gestione degli errori che si verificano durante l'analisi dei dati serializzati nella funzione unserialize(). In caso di problemi, unserialize() ora restituisce il codice E_WARNING anziché E_NOTICE.
- Apportate modifiche alla funzione range(). È stata garantita la generazione di un'eccezione in caso di tentativo di passare oggetti, risorse o array nelle variabili che definiscono i limiti del range, oltre a indicare un valore negativo nel parametro $step o un valore indefinito in qualsiasi parametro. È stata garantita la visualizzazione di un elenco di caratteri quando si specificano stringhe anziché numeri (ad esempio, 'range('5', 'z')').
- Comportamento dei tipi con proprietà statiche modificato: ora sovrascrivono le proprietà statiche ereditate dalla classe padre.
- Aggiunte impostazioni per la protezione dallo overflow dello stack. Nel file ini sono state aggiunte le direttive zend.max_allowed_stack_size e zend.reserved_stack_size, che definiscono la dimensione massima consentita e riservata dello stack. Il programma si fermerà con un errore se ci si avvicina all'esaurimento dello stack, quando lo stack è riempito oltre la differenza tra i valori di zend.max_allowed_stack_size e zend.reserved_stack_size (l'esecuzione verrà interrotta senza raggiungere una situazione di segmentation fault). Per impostazione predefinita, il valore di zend.max_allowed_stack_size è impostato su 0 (0 significa che la dimensione viene determinata automaticamente; per disabilitare il limite, impostare su -1).
- Aggiunte nuove funzioni POSIX posix_sysconf(), posix_pathconf(), posix_fpathconf() e posix_eaccess().
- Aggiunta la funzione mb_str_pad, che è un equivalente della funzione di stringa str_pad(), progettata per lavorare con codifiche multibyte come UTF-8.
- Consentita la creazione di chiusure da metodi e la trasmissione di argomenti nominati a queste chiusure. $test = new Test(); $closure = $test->magic(…); $closure(a: ‘hello’, b: ‘world’);
- È stato modificato il comportamento nella gestione della visibilità delle costanti nelle interfacce. interface I { public const FOO = 'foo'; } class C implements I { private const FOO = 'foo'; }
- Espanso il supporto per le funzioni array_sum(), array_product(), posix_getrlimit(), gc_status(), class_alias(), mysqli_poll(), array_pad() e proc_get_status().
- Dichiarata obsoleta la possibilità di passare un valore negativo $widths a mb_strimwidth(). Rimossa la costante NumberFormatter::TYPE_CURRENCY. Interrotta la supporto per la chiamata della funzione ldap_connect() con due parametri $host e $port. Rimossa l'impostazione opcache.consistency_checks.
Fonte: opennet.ru
