PHP è un linguaggio di scripting utilizzato da un gran numero di utenti per scopi di sviluppo web. L'ultima versione stabile e aggiornata di PHP, la 8.3, è stata rilasciata il 23.11.2023. Ci sono state molte innovazioni e cambiamenti rispetto a PHP 3.x, rilasciato nel 2000. PHP è ancora tra i linguaggi di sviluppo web (web design) più popolari e utilizzati da un pubblico molto vasto. In questo articolo esamineremo e analizzeremo le innovazioni e i cambiamenti in PHP 8.3 con esempi di codice.
PHP 8.3 Principali nuove funzionalità e miglioramenti
Ci sono molte innovazioni e miglioramenti importanti in PHP 8.3 rispetto alla versione precedente di PHP, PHP 8.2. Allo stesso tempo, alcune funzionalità sono state deprecate. Esamineremo ora le innovazioni e i miglioramenti uno per uno con esempi di codice.
Costanti di classe tipizzate
La dichiarazione del tipo è una funzionalità molto importante per gli sviluppatori che aumenta la stabilità e riduce i tassi di errore nello sviluppo web. La funzionalità di dichiarazione del tipo per le proprietà in una classe è stata aggiunta in PHP 7.4. Sebbene siano stati apportati molti miglioramenti a questa funzionalità nelle versioni successive, questa funzionalità non era ancora disponibile per le costanti della classe. Con PHP 8.3 è ora possibile dichiarare i tipi per le costanti nelle classi.
// Doğru kullanım:
class MyClass {
// Bildirilen tür ve değer aynı
const string VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür ile değer farklı
const int VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür sınıf sabitleri için desteklenmiyor
const void VERSION = "PHP 8.3"; // değer string
}Alcune dichiarazioni di tipo non sono supportate per le costanti di classe.
Dichiarazioni di tipo non supportate per costanti di classe: void, callable, never
Una nuova funzione: json_validate()
Quando si lavora con dati in formato JSON (dati con codifica json), è necessario verificare che i dati in ingresso siano validi prima di utilizzarli. Lo facevamo nelle versioni precedenti a PHP 8.3 utilizzando i metodi seguenti o simili.
// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_last_error() === JSON_ERROR_NONE) {
// $data ile gerçekleştirilecek işlemler
}In questo vecchio esempio, durante la convalida dei dati JSON, PHP può consumare una quantità significativa di memoria, a seconda della dimensione dei dati. In PHP 8.3 è stata aggiunta una nuova funzione PHP che crea una soluzione veloce orientata alle prestazioni: json_validate(). Di seguito abbiamo esemplificato lo scenario di utilizzo di questa funzione.
// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_validate($maybeJSON)) {
// $data ile gerçekleştirilecek işlemler
}Una nuova funzionalità: #[Sostituisci]
Quando implementiamo le interfacce in PHP, forniamo funzionalità dettagliate per i metodi nell'interfaccia. Quando creiamo un'istanza di una classe, possiamo sovrascrivere un metodo genitore creando una versione alternativa con lo stesso nome e firma compatibile. Ciò potrebbe causare grossi problemi al software. In breve, il problema è che pensiamo di aver sovrascritto il metodo principale a causa di un piccolo errore di battitura trascurato.
La funzione #[Override] di PHP 8.3 fornisce una soluzione a questo problema. Ora vediamolo nell'esempio.
class A {
protected function myOverrideFunc(): void {}
// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
#[\Override]
public function myOverrideFunc(): void {}
// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
#[\Override]
public function myOverrideFunction(): void {}
}Clonazione profonda di proprietà di sola lettura
PHP ha introdotto la possibilità di dichiarare le proprietà delle singole classi come di sola lettura in PHP 8.1 e di assegnarle all'intera classe in PHP 8.2. Tuttavia, la maggior parte degli sviluppatori web pensava che le limitazioni imposte quando si lavora con classi contenenti tali funzionalità impedissero la praticità nella logica di programmazione.
Per cambiare questo RFC Sono state formulate due raccomandazioni principali:
sola lettura
readonlyconsentire lezioni a cui non è consentito estenderereadonlyconsentendo il riavvio delle funzionalità durante la clonazione
Il secondo suggerimento è stato incluso in PHP 8.3. Questo nuovo approccio è stato aggiunto a PHP 8.3 readonly istanze di una classe con proprietàreadonly proprietà) __clone Permette di riavviarlo con il suo metodo magico.
Questo esempio di codice tratto dalla RFC può aiutarci a capire come funziona questo nuovo metodo:
Recupero dinamico di costanti di classe e membri di enumerazione
A differenza di altre funzionalità di PHP, acquisire costanti di classe e membri di enumerazione con nomi di variabili è un po' più complicato. Prima di PHP 8.3 potevamo farlo come nell'esempio seguente:
class Foo {
public function __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}
public function __clone() {
// Klon çağrıldığında $bar yeni bir DateTime alacak
$this->bar = clone $this->bar;
// Ardından bu metod çağrılacak
$this->cloneBaz();
}
private function cloneBaz() {
// Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
unset($this->baz);
}
}
$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;class MyClass {
public const THE_CONST = 9;
}
enum MyEnum: int {
case FirstMember = 9;
case SecondMember = 10;
}
$constantName = 'THE_CONST';
$memberName = 'FirstMember';
echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;Ora otteniamo i valori utilizzando le definizioni di classe ed enum nell'esempio sopra in PHP 8.3:
$constantName = 'THE_CONST';
$memberName = 'FirstNumber';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;Un nuovo metodo: getBytesFromString()
Possiamo dire che questo metodo è stato il più inaspettato tra le funzionalità aggiunte in PHP 8.3: generazione di testo casuale utilizzando una raccolta di caratteri pre-approvata.
Questo nuovo metodo è molto semplice e chiaro. Diamo alcuni caratteri al metodo come risorse e specifichiamo quanti di essi vogliamo utilizzare. Questo è tutto! Ora il nostro metodo restituirà risultati con caratteri casuali finché non raggiungerà la lunghezza specificata. Ora chiariamolo con un esempio
$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';
$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veriÈ possibile che l'output sia più lungo della lunghezza totale dei caratteri specificati. Lo abbiamo fatto nell'esempio seguente:
$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';
$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veriSe tutti i caratteri che diamo come parametri sono diversi, la probabilità di quale verrà selezionato è uguale. Tuttavia, possiamo far apparire più caratteri uguali nell'output aggiungendo più di un carattere uguale al nostro elenco di caratteri supportati. Lo abbiamo mostrato nel prossimo esempio.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';
$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veriNuovi metodi: getFloat() e nextFloat()
In questa innovazione, PHP 8.3 introduce due nuovi metodi che estendono l'estensione casuale di PHP: getFloat() e nextFloat().
Un esempio di questi metodi:
$generateRandomNumber = new Random\Randomizer();
// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri
// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veriInnovazioni e miglioramenti minori in PHP 8.3
Oltre alle innovazioni di cui sopra, PHP 8.3 presenta dozzine di altri miglioramenti e innovazioni su piccola scala. Li abbiamo elencati insieme ai loro documenti di origine nell'elenco seguente.
- Nuovi metodi per la classe DOMElement:
DOMElement::getAttributeNames(),DOMElement::insertAdjacentElement(),DOMElement::insertAdjacentText(),DOMElement::toggleAttribute(),DOMNode::contains(),DOMNode::getRootNode(),DOMNode::isEqualNode()DOMNameSpaceNode::contains() eMParentNode::replaceChildren(). - Nuovi metodi per la classe IntlCalendar:
IntlCalendar::setDate(),IntlCalendar::setDateTime(),IntlGregorianCalendar::createFromDate()eIntlGregorianCalendar::createFromDateTime(). - Nuove funzioni LDAP: ldap_connect_wallet() e ldap_exop_sync().
- nuovo
mb_str_pad()funzione stringa multibyte (funzione stringa multibyte). - Nuove funzioni POSIX:
posix_sysconf(),posix_pathconf(),posix_fpathconf()eposix_eaccess(). - Nuovo metodo:
ReflectionMethod::createFromMethodName() - Nuova funzione presa:
socket_atmark(). - Nuove funzioni stringa (testo):
str_increment(),str_decrement(), estream_context_set_options(). - Nuovo metodo della classe ZipArchive:
ZipArchive::getArchiveFlag(). - Nuova impostazione php.ini per impostare la dimensione massima consentita dello stack:
zend.max_allowed_stack_size.
Deprecato in PHP 8.3
Con ogni nuova versione di PHP, parte del codice viene contrassegnato come deprecato. Non è mai consigliabile utilizzare queste funzionalità una volta che sono completamente deprecate. Se viene utilizzato codice deprecato, verrà restituito un messaggio di errore quando il codice viene eseguito.
Elenco delle deprecazioni in PHP 8.3:
- La costante U_MULTIPLE_DECIMAL_SEPARATORS è stata deprecata.
- Mt19937
3MT_RAND_PHPLa variante è stata deprecata. ReflectionClass::getStaticProperties()non può più essere annullabile.- Impostazioni PHP.ini
assert.active,assert.bail,assert.callback,assert.exceptioneassert.warningè stato deprecato. get_class()eget_parent_class()è stato deprecato.
PHP8.3
In questo articolo abbiamo esaminato le importanti modifiche e innovazioni di PHP 8.3. Per un elenco più dettagliato di tutte le modifiche in PHP 8.3 registro delle modifiche ufficiale Ti consigliamo di rivederlo. Se desideri aggiornare i tuoi codici o il tuo sito da PHP 8.2 a PHP 8.3, questa guida può esserti utile: Guida alla migrazione di PHP 8.3 -> https://www.php.net/manual/en/migration83.php
Se sei preoccupato per le versioni PHP e la migrazione, ti consigliamo di concedere un po' di tempo alla nuova versione per eseguire l'aggiornamento a PHP 8.3.
Copertura completa dei linguaggi PHP e JavaScript e delle tecnologie correlate come Onur Özden Web Çözümleri Software Web Offriamo servizi. Se hai una domanda o una richiesta puoi contattarci velocemente tramite il pulsante Whatsapp in basso a sinistra per ottenere un preventivo.



