PHP je skriptni jezik koji koristi veliki broj korisnika za potrebe web razvoja. Najnovija stabilna i ažurirana verzija PHP-a, 8.3, objavljena je 23.11.2023. Bilo je mnogo inovacija i promjena od PHP 3.x, objavljenog 2000. PHP je i dalje među najpopularnijim jezicima za web razvoj (web dizajn) koje koristi vrlo velika publika. U ovom članku ćemo ispitati i analizirati inovacije i promjene u PHP 8.3 s primjerima koda.
PHP 8.3 Glavne nove karakteristike i poboljšanja
Postoje mnoge velike inovacije i poboljšanja u PHP 8.3 u poređenju sa prethodnom verzijom PHP-a, PHP 8.2. U isto vrijeme, neke karakteristike su zastarjele. Sada ćemo ispitati inovacije i poboljšanja jedan po jedan s primjerima koda.
Upisane konstante klase
Deklaracija tipa je vrlo važna karakteristika za programere koja povećava stabilnost i smanjuje stopu grešaka u web razvoju. Funkcija deklaracije tipa za svojstva u klasi dodata je u PHP 7.4. Iako su u kasnijim verzijama napravljena mnoga poboljšanja ove funkcije, ova funkcija još uvijek nije bila dostupna za konstante u klasi. Sa PHP 8.3, sada je moguće deklarisati tipove za konstante u klasama.
// 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
}Neke deklaracije tipa nisu podržane za konstante klase.
Nepodržane deklaracije tipa za konstante klase: void, callable, never
Nova funkcija: json_validate()
Kada radimo sa podacima u JSON formatu (json-kodirani podaci), moramo provjeriti da li su dolazni podaci valjani prije upotrebe podataka. To smo radili u verzijama prije PHP 8.3 koristeći sljedeće ili slične metode.
// 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
}U ovom starom primjeru, prilikom provjere JSON podataka, PHP može potrošiti značajnu memoriju, ovisno o veličini podataka. U PHP 8.3, dodata je nova PHP funkcija koja kreira brzo rešenje orijentisano na performanse: json_validate(). U nastavku smo dali primjer scenarija korištenja ove funkcije.
// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_validate($maybeJSON)) {
// $data ile gerçekleştirilecek işlemler
}Nova karakteristika: #[Override]
Kada implementiramo interfejse u PHP-u, pružamo detaljnu funkcionalnost za metode u interfejsu. Kada kreiramo instancu klase, možemo nadjačati roditeljski metod kreiranjem alternativne verzije sa istim imenom i kompatibilnim potpisom. Ovo može uzrokovati velike probleme u softveru. Ukratko, problem je u tome što mislimo da smo nadjačali glavni metod kao rezultat male greške u kucanju.
PHP 8.3 #[Override] funkcija pruža rješenje za ovaj problem. Sada da vidimo ovo na primjeru.
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 {}
}Dubinsko kloniranje svojstava samo za čitanje
PHP je uveo mogućnost deklarisanja pojedinačnih svojstava klase kao samo za čitanje u PHP 8.1 i dodeljivanja ih celoj klasi u PHP 8.2. Međutim, većina web programera smatrala je da ograničenja nametnuta pri radu sa klasama koje sadrže takve karakteristike sprečavaju praktičnost u logici programiranja.
Da promijenim ovo RFC Date su dvije glavne preporuke:
samo za čitanje
readonlydozvoljavajući klase kojima nije dozvoljeno proširenjereadonlyomogućavajući ponovno pokretanje funkcija tokom kloniranja
Drugi prijedlog je uključen u PHP 8.3. Ovaj novi pristup je dodat u PHP 8.3 readonly instance klase sa svojstvimareadonly svojstva) __clone Omogućava da se ponovo pokrene svojom magičnom metodom.
Ovaj primjer koda iz RFC-a može nam pomoći da shvatimo kako ova nova metoda funkcionira:
Dinamičko dohvaćanje konstanti klase i Enum članova
Za razliku od drugih funkcija u PHP-u, hvatanje konstanti klase i članova enuma sa imenima varijabli je malo komplikovanije. Prije PHP 8.3 mogli smo to učiniti kao primjer u nastavku:
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;Sada, hajde da dobijemo vrednosti koristeći definicije klase i enuma u gornjem primeru u PHP 8.3:
$constantName = 'THE_CONST';
$memberName = 'FirstNumber';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;Nova metoda: getBytesFromString()
Možemo reći da je ovaj metod bio najneočekivaniji među funkcijama koje su dodane u PHP 8.3: Generisanje slučajnog teksta korišćenjem unapred odobrene kolekcije znakova.
Ova nova metoda je vrlo jednostavna i jasna. Dajemo neke znakove metodi kao resurse i specificiramo koliko ih želimo koristiti. To je sve! Sada će naša metoda vraćati rezultate sa nasumičnim znakovima dok ne dostigne određenu dužinu. Sada da to razjasnimo na primjeru
$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 veriMoguće je da izlaz bude duži od ukupne dužine znakova koje smo naveli. To smo uradili u primjeru ispod:
$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';
$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veriAko su svi znakovi koje dajemo kao parametre različiti, vjerovatnoća koji će biti odabran je jednaka. Međutim, možemo učiniti da se više istih znakova pojavljuje u izlazu dodavanjem više od jednog istih znakova na našu listu podržanih znakova. To smo pokazali u sljedećem primjeru.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';
$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veriNove metode: getFloat() i nextFloat()
U ovoj inovaciji, PHP 8.3 uvodi dvije nove metode koje proširuju PHP-ovu nasumično proširenje: getFloat() i nextFloat().
Primjer ovih metoda:
$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 veriManje inovacije i poboljšanja u PHP-u 8.3
Pored gore navedenih inovacija, PHP 8.3 ima desetine drugih manjih poboljšanja i inovacija. Naveli smo ih zajedno sa njihovim izvornim dokumentima na listi ispod.
- Nove metode za klasu DOMElement:
DOMElement::getAttributeNames(),DOMElement::insertAdjacentElement(),DOMElement::insertAdjacentText(),DOMElement::toggleAttribute(),DOMNode::contains(),DOMNode::getRootNode(),DOMNode::isEqualNode()DOMNameSpaceNode::contains() iMParentNode::replaceChildren(). - Nove metode za klasu IntlCalendar:
IntlCalendar::setDate(),IntlCalendar::setDateTime(),IntlGregorianCalendar::createFromDate()iIntlGregorianCalendar::createFromDateTime(). - Nove LDAP funkcije: ldap_connect_wallet() i ldap_exop_sync().
- novo
mb_str_pad()funkcija višebajtnog niza (funkcija višebajtnog niza). - Nove POSIX funkcije:
posix_sysconf(),posix_pathconf(),posix_fpathconf()iposix_eaccess(). - Nova metoda:
ReflectionMethod::createFromMethodName() - Nova funkcija utičnice:
socket_atmark(). - Nove funkcije niza (teksta):
str_increment(),str_decrement(), istream_context_set_options(). - Nova metoda klase ZipArchive:
ZipArchive::getArchiveFlag(). - Nova postavka php.ini za postavljanje maksimalne dozvoljene veličine steka:
zend.max_allowed_stack_size.
Zastarjelo u PHP 8.3
Sa svakom novom verzijom PHP-a, neki kod je označen za zastarelost. Nikada se ne preporučuje korištenje ovih funkcija nakon što su potpuno zastarjele. Ako se koristi zastarjeli kod, poruka o grešci će biti vraćena kada se kod izvrši.
Lista zastarjelih u PHP 8.3:
- Konstanta U_MULTIPLE_DECIMAL_SEPARATORS je zastarjela.
- Mt19937
3MT_RAND_PHPVarijanta je zastarjela. ReflectionClass::getStaticProperties()više ne može biti nullable.- PHP.ini postavke
assert.active,assert.bail,assert.callback,assert.exceptioniassert.warningje zastarjelo. get_class()iget_parent_class()je zastarjelo.
PHP 8.3
U ovom članku smo pregledali važne promjene i inovacije u PHP 8.3. Za detaljniju listu svih promjena u PHP 8.3 zvanični dnevnik promjena Preporučujemo da ga pregledate. Ako želite da nadogradite svoje kodove ili web lokaciju sa PHP 8.2 na PHP 8.3, ovaj vodič može biti koristan: PHP 8.3 Vodič za migraciju -> https://www.php.net/manual/en/migration83.php
Ako ste zabrinuti za verzije PHP-a i migraciju, preporučujemo da novoj verziji date malo vremena za nadogradnju na PHP 8.3.
Potpuna pokrivenost PHP i JavaScript jezika i srodnih tehnologija kao Onur Özden Web Çözümleri Web softver Nudimo usluge. Ako imate pitanje ili zahtjev, možete nas brzo kontaktirati putem Whatsapp dugmeta u donjem lijevom kutu kako biste dobili ponudu.



