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

  1. readonly dozvoljavajući klase kojima nije dozvoljeno proširenje
  2. readonly omoguć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 veri

Moguć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 veri

Ako 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 veri

Nove 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 veri

Manje 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.

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:

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.