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 još uvijek među najpopularnijim jezicima za web razvoj (web dizajn) koji 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 značajke i poboljšanja

Postoje mnoge velike inovacije i poboljšanja u PHP 8.3 u usporedbi s prethodnom PHP verzijom, PHP 8.2. U isto vrijeme, neke značajke su zastarjele. Sada ćemo ispitati inovacije i poboljšanja jednu po jednu s primjerima koda.

Konstante tipiziranih klasa

Deklariranje tipa vrlo je važna značajka za programere koja povećava stabilnost i smanjuje stope pogrešaka u web razvoju. Značajka deklaracije tipa za svojstva u klasi dodana je u PHP 7.4. Iako su u kasnijim verzijama napravljena mnoga poboljšanja ove značajke, ova značajka još uvijek nije bila dostupna za konstante u klasi. Uz PHP 8.3, sada je moguće deklarirati 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 s podacima u JSON formatu (json kodirani podaci), moramo provjeriti jesu li dolazni podaci valjani prije upotrebe podataka. To smo radili u verzijama prije PHP-a 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 valjanosti JSON podataka, PHP može potrošiti značajnu količinu memorije, ovisno o veličini podataka. U PHP 8.3 dodana je nova PHP funkcija koja stvara brzo rješenje orijentirano 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 značajka: #[Nadjačaj]

Prilikom implementacije sučelja u PHP-u, nudimo detaljnu funkcionalnost za metode u sučelju. Kada stvaramo instancu klase, možemo nadjačati nadređenu metodu stvaranjem alternativne verzije s istim imenom i kompatibilnim potpisom. To može uzrokovati velike probleme u softveru. Ukratko, problem je u tome što mislimo da smo nadjačali glavnu metodu kao rezultat male pogreške pri upisu.

Značajka PHP 8.3 #[Override] nudi rješenje za ovaj problem. Pogledajmo sada 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 {}
}

Duboko kloniranje svojstava samo za čitanje

PHP je uveo mogućnost deklariranja pojedinačnih svojstava klase kao readonly u PHP-u 8.1 i njihovog dodjeljivanja cijeloj klasi u PHP-u 8.2. Međutim, većina web programera smatrala je da ograničenja nametnuta pri radu s klasama koje sadrže takve značajke sprječavaju praktičnost u programskoj logici.

Da promijenim ovo RFC Iznesene su dvije glavne preporuke:

samo za čitanje

  1. readonly dopuštajući nastavu koja se ne smije produžavati
  2. readonly omogućujući ponovno pokretanje značajki tijekom kloniranja

Drugi prijedlog je uključen u PHP 8.3. Ovaj novi pristup dodan u PHP 8.3 readonly instance klase sa svojstvimareadonly svojstva) __clone Omogućuje njegovo ponovno pokretanje svojom čarobnom 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 članova enuma

Za razliku od drugih značajki u PHP-u, hvatanje konstanti klase i članova enuma s imenima varijabli malo je kompliciranije. Prije PHP 8.3 mogli smo to učiniti kao u primjeru ispod:

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;

Uzmimo sada vrijednosti pomoću definicija klase i enuma u gornjem primjeru u PHP-u 8.3:

$constantName = 'THE_CONST';
$memberName = 'FirstNumber';

echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;

Nova metoda: getBytesFromString()

Možemo reći da je ova metoda bila najneočekivanija među značajkama dodanim u PHP 8.3: Generiranje nasumičnog teksta korištenjem unaprijed odobrene zbirke znakova.

Ova nova metoda je vrlo jednostavna i jasna. Dajemo neke znakove metodi kao resurse i specificiramo koliko njih želimo koristiti. To je sve! Sada će naša metoda vraćati rezultate s nasumičnim znakovima dok ne dosegne zadanu duljinu. Sada pojasnimo ovo 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 duljine znakova koje smo naveli. To smo učinili u primjeru u nastavku:

$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';

$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veri

Ako su svi znakovi koje dajemo kao parametre različiti, vjerojatnost koji će biti odabran je jednaka. Međutim, možemo učiniti da se više istih znakova pojavi u izlazu dodavanjem više od jednog istog znaka na naš popis 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-ovo slučajno 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

Uz gore navedene inovacije, PHP 8.3 ima desetke drugih manjih poboljšanja i inovacija. Naveli smo ih zajedno s njihovim izvornim dokumentima na donjem popisu.

Zastarjelo u PHP-u 8.3

Sa svakom novom verzijom PHP-a, neki kod se označava za zastarjelu. Nikada se ne preporučuje korištenje ovih značajki nakon što su potpuno zastarjele. Ako se koristi zastarjeli kod, poruka o pogrešci bit će vraćena kada se kôd izvrši.

Popis obustavljenih mjera u PHP 8.3:

PHP 8.3

U ovom smo članku pregledali važne promjene i inovacije u PHP 8.3. Za detaljniji popis svih promjena u PHP-u 8.3 službeni dnevnik promjena Preporučujemo da ga pregledate. Ako želite nadograditi svoje kodove ili web mjesto s PHP 8.2 na PHP 8.3, ovaj vodič može biti koristan: Vodič za migraciju na PHP 8.3 -> https://www.php.net/manual/en/migration83.php

Ako ste zabrinuti zbog verzija PHP-a i migracije, preporučujemo da novoj verziji date neko vrijeme za nadogradnju na PHP 8.3.

Potpuna pokrivenost PHP i JavaScript jezika i povezanih tehnologija kao Onur Özden Web Çözümleri Web softver Nudimo usluge.  Ako imate pitanje ili zahtjev, možete nas brzo kontaktirati putem Whatsapp gumba u donjem lijevom kutu kako biste dobili ponudu.