PHP është një gjuhë skriptimi që përdoret nga një numër i madh përdoruesish për qëllime të zhvillimit të uebit. Versioni më i fundit i qëndrueshëm dhe i përditësuar i PHP, 8.3, u lëshua më 23.11.2023. Ka pasur shumë risi dhe ndryshime që nga PHP 3.x, i lëshuar në vitin 2000. PHP është ende ndër gjuhët më të njohura të zhvillimit të uebit (web design) që përdoret nga një audiencë shumë e madhe. Në këtë artikull, ne do të shqyrtojmë dhe analizojmë risitë dhe ndryshimet në PHP 8.3 me shembuj kodesh.

PHP 8.3 Karakteristikat dhe përmirësimet kryesore të reja

Ka shumë risi dhe përmirësime të mëdha në PHP 8.3 në krahasim me versionin e mëparshëm PHP, PHP 8.2. Në të njëjtën kohë, disa veçori janë zhvlerësuar. Tani do të shqyrtojmë risitë dhe përmirësimet një nga një me shembuj kodesh.

Konstantet e klasave të shtypura

Deklarimi i llojit është një veçori shumë e rëndësishme për zhvilluesit që rrit stabilitetin dhe zvogëlon shkallën e gabimeve në zhvillimin e uebit. Tipari i deklarimit të tipit për vetitë në një klasë u shtua në PHP 7.4. Edhe pse shumë përmirësime i janë bërë kësaj veçori në versionet e mëvonshme, kjo veçori nuk ishte ende e disponueshme për konstantet në klasë. Me PHP 8.3, tani është e mundur të deklarohen llojet për konstante në klasa.

// 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
}

Disa deklarata të tipit nuk mbështeten për konstantet e klasës.

Deklarata të tipit të pambështetur për konstantet e klasës: void, callable, never

Një funksion i ri: json_validate()

Kur punojmë me të dhëna në formatin JSON (të dhëna të koduara me json), duhet të verifikojmë që të dhënat hyrëse janë të vlefshme përpara se të përdorim të dhënat. Ne po e bënim këtë në versionet para PHP 8.3 duke përdorur metodat e mëposhtme ose të ngjashme.

// 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ë këtë shembull të vjetër, kur vërteton të dhënat JSON, PHP mund të konsumojë memorie të konsiderueshme, në varësi të madhësisë së të dhënave. Në PHP 8.3, u shtua një funksion i ri PHP që krijon një zgjidhje të shpejtë të orientuar drejt performancës: json_validate(). Më poshtë kemi paraqitur skenarin e përdorimit të këtij funksioni.

// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);

if (json_validate($maybeJSON)) {
    // $data ile gerçekleştirilecek işlemler
}

Një veçori e re: #[Override]

Kur zbatojmë ndërfaqe në PHP, ne ofrojmë funksionalitet të detajuar për metodat në ndërfaqe. Kur krijojmë një shembull të një klase, ne mund të anashkalojmë një metodë prind duke krijuar një version alternativ me të njëjtin emër dhe nënshkrim të pajtueshëm. Kjo mund të shkaktojë probleme të mëdha në softuer. Shkurtimisht, problemi është se ne mendojmë se kemi anashkaluar metodën kryesore si rezultat i një gabimi të vogël shkrimi të neglizhuar.

Funksioni PHP 8.3 #[Override] ofron një zgjidhje për këtë problem. Tani le ta shohim këtë në shembull.

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 {}
}

Klonimi i thellë i vetive vetëm për lexim

PHP prezantoi mundësinë e deklarimit të veçorive të klasës individuale si vetëm për lexim në PHP 8.1 dhe caktimin e tyre për të gjithë klasën në PHP 8.2. Megjithatë, shumica e zhvilluesve të uebit mendonin se kufizimet e vendosura kur punonin me klasa që përmbajnë karakteristika të tilla pengonin prakticitetin në logjikën e programimit.

Për ta ndryshuar këtë RFC Janë bërë dy rekomandime kryesore:

vetëm për lexim

  1. readonly duke lejuar që klasat që nuk lejohen të zgjaten
  2. readonly duke lejuar rinisjen e veçorive gjatë klonimit

Sugjerimi i dytë u përfshi në PHP 8.3. Kjo qasje e re iu shtua PHP 8.3 readonly shembuj të një klase me vetireadonly vetitë) __clone Kjo e lejon atë të rifillojë me metodën e saj magjike.

Ky shembull kodi nga RFC mund të na ndihmojë të kuptojmë se si funksionon kjo metodë e re:

Marrja dinamike e konstantave të klasës dhe anëtarëve të numrit

Ndryshe nga veçoritë e tjera në PHP, kapja e konstantave të klasës dhe anëtarëve të numërimit me emra variablash është pak më e komplikuar. Përpara PHP 8.3 ne mund ta bënim këtë si shembulli më poshtë:

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;

Tani, le të marrim vlerat duke përdorur përkufizimet e klasës dhe enum në shembullin e mësipërm në PHP 8.3:

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

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

Një metodë e re: getBytesFromString()

Mund të themi se kjo metodë ishte më e papritura ndër veçoritë e shtuara në PHP 8.3: Gjenerimi i tekstit të rastësishëm duke përdorur një koleksion karakteresh të miratuar paraprakisht.

Kjo metodë e re është shumë e thjeshtë dhe e qartë. Ne i japim disa karaktere metodës si burime dhe specifikojmë se sa prej tyre duam të përdorim. Kjo është e gjitha! Tani metoda jonë do të kthejë rezultate me karaktere të rastësishme derisa të arrijë gjatësinë e specifikuar. Tani le ta sqarojmë këtë me një shembull

$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

Është e mundur që dalja të jetë më e gjatë se gjatësia totale e karaktereve që kemi specifikuar. Ne e bëmë këtë në shembullin e mëposhtëm:

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

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

Nëse të gjithë karakteret që japim si parametra janë të ndryshëm, probabiliteti i të cilit do të zgjidhet është i barabartë. Megjithatë, ne mund të bëjmë që më shumë karaktere të njëjta të shfaqen në dalje duke shtuar më shumë se një karakter të njëjtë në listën tonë të karaktereve të mbështetur. Këtë e treguam në shembullin tjetër.

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

$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veri

Metodat e reja: getFloat() dhe nextFloat()

Në këtë risi, PHP 8.3 prezanton dy metoda të reja që zgjerojnë shtrirjen e rastësishme të PHP: getFloat() dhe nextFloat().

Një shembull i këtyre metodave:

$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

Inovacione dhe përmirësime të vogla në PHP 8.3

Përveç risive të mësipërme, PHP 8.3 ka dhjetëra përmirësime dhe risi të tjera në shkallë të vogël. Ne i kemi renditur ato së bashku me dokumentet e tyre burimore në listën e mëposhtme.

I zhvlerësuar në PHP 8.3

Me çdo version të ri të PHP, disa kode shënohen për anulim. Asnjëherë nuk rekomandohet përdorimi i këtyre veçorive pasi ato të jenë plotësisht të vjetruara. Nëse përdoret kodi i vjetëruar, një mesazh gabimi do të kthehet kur kodi të ekzekutohet.

Lista e zhvlerësimeve në PHP 8.3:

PHP 8.3

Në këtë artikull, ne shqyrtuam ndryshimet dhe risitë e rëndësishme në PHP 8.3. Për një listë më të detajuar të të gjitha ndryshimeve në PHP 8.3 ditari zyrtar i ndryshimeve Ne ju rekomandojmë ta rishikoni atë. Nëse dëshironi të përmirësoni kodet ose faqen tuaj nga PHP 8.2 në PHP 8.3, ky udhëzues mund të jetë i dobishëm: PHP 8.3 Migration Guide -> https://www.php.net/manual/en/migration83.php

Nëse jeni të shqetësuar për versionet PHP dhe migrimin, ju rekomandojmë t'i jepni versionit të ri pak kohë për ta përmirësuar në PHP 8.3.

Mbulim i plotë i PHP dhe JavaScript gjuhëve dhe teknologjive të ngjashme si Onur Özden Web Çözümleri Software Web Ne ofrojmë shërbime.  Nëse keni një pyetje ose kërkesë, mund të na kontaktoni shpejt përmes butonit Whatsapp në fund majtas për të marrë një ofertë.