PHP este un limbaj de scripting folosit de un număr mare de utilizatori în scopuri de dezvoltare web. Cea mai recentă versiune stabilă și actualizată de PHP, 8.3, a fost lansată pe 23.11.2023. Au existat multe inovații și schimbări de la PHP 3.x, lansat în 2000. PHP este încă printre cele mai populare limbaje de dezvoltare web (design web) folosite de un public foarte larg. În acest articol, vom examina și analiza inovațiile și schimbările din PHP 8.3 cu exemple de cod.
PHP 8.3 Noi caracteristici și îmbunătățiri majore
Există multe inovații și îmbunătățiri majore în PHP 8.3 în comparație cu versiunea anterioară de PHP, PHP 8.2. În același timp, unele funcții au fost depreciate. Vom examina acum inovațiile și îmbunătățirile una câte una cu exemple de cod.
Constante de clasă tipizate
Declararea tipului este o caracteristică foarte importantă pentru dezvoltatori care crește stabilitatea și reduce ratele de eroare în dezvoltarea web. Caracteristica de declarare a tipului pentru proprietățile dintr-o clasă a fost adăugată în PHP 7.4. Deși au fost aduse multe îmbunătățiri acestei caracteristici în versiunile ulterioare, această caracteristică nu era încă disponibilă pentru constantele din clasă. Cu PHP 8.3, acum este posibil să declarați tipuri pentru constante în clase.
// 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
}Unele declarații de tip nu sunt acceptate pentru constantele de clasă.
Declarații de tip neacceptate pentru constantele clasei: void, callable, never
O funcție nouă: json_validate()
Când lucrăm cu date în format JSON (date codificate în json), trebuie să verificăm dacă datele primite sunt valide înainte de a folosi datele. Făceam acest lucru în versiunile anterioare PHP 8.3 folosind următoarele metode sau similare.
// 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
}În acest exemplu vechi, la validarea datelor JSON, PHP poate consuma memorie semnificativă, în funcție de dimensiunea datelor. În PHP 8.3, a fost adăugată o nouă funcție PHP care creează o soluție rapidă orientată spre performanță: json_validate(). Am exemplificat scenariul de utilizare a acestei funcții mai jos.
// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_validate($maybeJSON)) {
// $data ile gerçekleştirilecek işlemler
}O funcție nouă: #[Anulare]
Când implementăm interfețe în PHP, oferim funcționalități detaliate pentru metodele din interfață. Când creăm o instanță a unei clase, putem suprascrie o metodă părinte prin crearea unei versiuni alternative cu același nume și semnătură compatibilă. Acest lucru poate cauza probleme majore în software. Pe scurt, problema este că credem că am depășit metoda principală ca urmare a unei mici greșeli de scriere trecute cu vederea.
Caracteristica PHP 8.3 #[Override] oferă o soluție pentru această problemă. Acum să vedem asta în exemplu.
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 {}
}Clonarea profundă a proprietăților numai în citire
PHP a introdus posibilitatea de a declara proprietățile individuale ale clasei ca fiind doar citite în PHP 8.1 și de a le atribui întregii clase în PHP 8.2. Cu toate acestea, majoritatea dezvoltatorilor web au considerat că limitările impuse atunci când lucrați cu clase care conțin astfel de caracteristici au împiedicat caracterul practic în logica de programare.
Pentru a schimba asta RFC Au fost făcute două recomandări principale:
numai citire
readonlypermițând prelungirea claselor care nu au voiereadonlypermițând repornirea caracteristicilor în timpul clonării
A doua sugestie a fost inclusă în PHP 8.3. Această nouă abordare a adăugat PHP 8.3 readonly instanțe ale unei clase cu proprietățireadonly proprietăți) __clone Îi permite să fie repornit cu metoda sa magică.
Acest exemplu de cod din RFC ne poate ajuta să înțelegem cum funcționează această nouă metodă:
Preluare dinamică a constantelor de clasă și a membrilor Enum
Spre deosebire de alte caracteristici din PHP, capturarea constantelor de clasă și a membrilor enumerației cu nume de variabile este puțin mai complicată. Înainte de PHP 8.3, am putea face acest lucru ca în exemplul de mai jos:
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;Acum, să obținem valorile folosind definițiile de clasă și enumerare din exemplul de mai sus în PHP 8.3:
$constantName = 'THE_CONST';
$memberName = 'FirstNumber';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;O nouă metodă: getBytesFromString()
Putem spune că această metodă a fost cea mai neașteptată dintre caracteristicile adăugate în PHP 8.3: Generarea de text aleatoriu folosind o colecție de caractere preaprobată.
Această nouă metodă este foarte simplă și clară. Oferim metodei câteva caractere ca resurse și specificăm câte dintre ele vrem să folosim. Asta e tot! Acum metoda noastră va returna rezultate cu caractere aleatorii până când atinge lungimea specificată. Acum să clarificăm acest lucru cu un exemplu
$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 veriEste posibil ca rezultatul să fie mai mare decât lungimea totală a caracterelor pe care le-am specificat. Am făcut asta în exemplul de mai jos:
$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';
$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veriDacă toate caracterele pe care le dăm ca parametri sunt diferite, probabilitatea căreia unul va fi selectat este egală. Cu toate acestea, putem face să apară mai multe din același caracter în ieșire adăugând mai mult de unul din același caracter la lista noastră de caractere acceptate. Am arătat acest lucru în exemplul următor.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';
$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veriMetode noi: getFloat() și nextFloat()
În această inovație, PHP 8.3 introduce două metode noi care extind extensia aleatorie a PHP: getFloat() și nextFloat().
Un exemplu de aceste metode:
$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 veriInovații și îmbunătățiri minore în PHP 8.3
Pe lângă inovațiile de mai sus, PHP 8.3 are zeci de alte îmbunătățiri și inovații la scară mică. Le-am enumerat împreună cu documentele lor sursă în lista de mai jos.
- Noi metode pentru clasa DOMElement:
DOMElement::getAttributeNames(),DOMElement::insertAdjacentElement(),DOMElement::insertAdjacentText(),DOMElement::toggleAttribute(),DOMNode::contains(),DOMNode::getRootNode(),DOMNode::isEqualNode()DOMNameSpaceNode::contains() șiMParentNode::replaceChildren(). - Noi metode pentru clasa IntlCalendar:
IntlCalendar::setDate(),IntlCalendar::setDateTime(),IntlGregorianCalendar::createFromDate()şiIntlGregorianCalendar::createFromDateTime(). - Noi funcții LDAP: ldap_connect_wallet() și ldap_exop_sync().
- nou
mb_str_pad()funcție șir multi-octeți (funcție șir multi-octeți). - Noi funcții POSIX:
posix_sysconf(),posix_pathconf(),posix_fpathconf()şiposix_eaccess(). - Metoda noua:
ReflectionMethod::createFromMethodName() - Noua functie de priza:
socket_atmark(). - Funcții noi de tip șir (text):
str_increment(),str_decrement(), șistream_context_set_options(). - Noua metodă de clasă ZipArchive:
ZipArchive::getArchiveFlag(). - Setare nouă php.ini pentru a seta dimensiunea maximă permisă a stivei:
zend.max_allowed_stack_size.
Depreciat în PHP 8.3
Cu fiecare versiune nouă de PHP, un anumit cod este marcat pentru depreciere. Nu este niciodată recomandat să utilizați aceste funcții odată ce sunt complet depreciate. Dacă se folosește cod învechit, va fi returnat un mesaj de eroare când codul este executat.
Lista de deprecieri în PHP 8.3:
- Constanta U_MULTIPLE_DECIMAL_SEPARATORS a fost retrasă.
- Mt19937
3MT_RAND_PHPVarianta a fost retrasă. ReflectionClass::getStaticProperties()nu mai poate fi anulabil.- setări PHP.ini
assert.active,assert.bail,assert.callback,assert.exceptionşiassert.warninga fost depreciat. get_class()şiget_parent_class()a fost depreciat.
PHP 8.3
În acest articol, am analizat schimbările și inovațiile importante din PHP 8.3. Pentru o listă mai detaliată a tuturor modificărilor din PHP 8.3 jurnalul de modificări oficial Vă recomandăm să o revizuiți. Dacă doriți să actualizați codurile sau site-ul dvs. de la PHP 8.2 la PHP 8.3, acest ghid poate fi util: Ghid de migrare PHP 8.3 -> https://www.php.net/manual/en/migration83.php
Dacă vă îngrijorează versiunile PHP și migrarea, vă recomandăm să acordați timp noii versiuni pentru a face upgrade la PHP 8.3.
Acoperire completă a PHP și JavaScript limbi și tehnologii conexe ca Onur Özden Web Çözümleri Software Web Oferim servicii. Dacă aveți o întrebare sau o solicitare, ne puteți contacta rapid prin intermediul butonului Whatsapp din stânga jos pentru a obține o ofertă.



