PHP je skriptovací jazyk používaný velkým počtem uživatelů pro účely vývoje webu. Poslední stabilní a aktualizovaná verze PHP, 8.3, byla vydána 23.11.2023. Od PHP 3.x, vydaného v roce 2000, došlo k mnoha inovacím a změnám. PHP stále patří mezi nejoblíbenější jazyky pro vývoj webových aplikací (webdesign), které používá velmi široké publikum. V tomto článku prozkoumáme a analyzujeme inovace a změny v PHP 8.3 s příklady kódu.

PHP 8.3 Hlavní nové funkce a vylepšení

V PHP 8.3 je mnoho zásadních inovací a vylepšení oproti předchozí verzi PHP, PHP 8.2. Zároveň byly některé funkce zastaralé. Nyní prozkoumáme inovace a vylepšení jednu po druhé s příklady kódu.

Typované konstanty třídy

Deklarování typu je pro vývojáře velmi důležitá funkce, která zvyšuje stabilitu a snižuje chybovost při vývoji webu. Funkce deklarace typu pro vlastnosti ve třídě byla přidána do PHP 7.4. Ačkoli v pozdějších verzích byla provedena řada vylepšení této funkce, tato funkce stále nebyla dostupná pro konstanty ve třídě. S PHP 8.3 je nyní možné deklarovat typy pro konstanty ve třídách.

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

Některé deklarace typu nejsou podporovány pro konstanty třídy.

Nepodporované deklarace typu pro konstanty třídy: void, callable, never

Nová funkce: json_validate()

Při práci s daty ve formátu JSON (data kódovaná json) musíme před použitím dat ověřit, zda jsou příchozí data platná. Dělali jsme to ve verzích před PHP 8.3 pomocí následujících nebo podobných metod.

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

V tomto starém příkladu může PHP při ověřování dat JSON spotřebovat značné množství paměti v závislosti na velikosti dat. V PHP 8.3 byla přidána nová funkce PHP, která vytváří rychlé řešení orientované na výkon: json_validate(). Níže jsme uvedli příklad scénáře použití této funkce.

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

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

Nová funkce: #[Override]

Při implementaci rozhraní v PHP poskytujeme podrobnou funkčnost pro metody v rozhraní. Při vytváření instance třídy můžeme přepsat nadřazenou metodu vytvořením alternativní verze se stejným názvem a kompatibilním podpisem. To může způsobit velké problémy v softwaru. Stručně řečeno, problém je v tom, že si myslíme, že jsme hlavní metodu přepsali v důsledku malého přehlédnutého překlepu.

PHP 8.3 funkce #[Override] poskytuje řešení tohoto problému. Nyní se na to podívejme na příkladu.

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

Hluboké klonování vlastností pouze pro čtení

PHP zavedlo v PHP 8.1 možnost deklarovat vlastnosti jednotlivých tříd jako pouze pro čtení a v PHP 8.2 je přiřadit celé třídě. Většina webových vývojářů se však domnívala, že omezení kladená při práci s třídami obsahujícími takové funkce brání praktičnosti v programovací logice.

Chcete-li to změnit RFC Byla učiněna dvě hlavní doporučení:

pouze pro čtení

  1. readonly umožňuje třídy, které není povoleno rozšiřovat
  2. readonly umožňující restartování funkcí během klonování

Druhý návrh byl zahrnut v PHP 8.3. Tento nový přístup byl přidán do PHP 8.3 readonly instance třídy s vlastnostmireadonly vlastnosti) __clone Umožňuje jej restartovat svou magickou metodou.

Tento příklad kódu z RFC nám může pomoci pochopit, jak tato nová metoda funguje:

Dynamické načítání konstant třídy a členů výčtu

Na rozdíl od jiných funkcí v PHP je zachycení konstant tříd a členů výčtu s názvy proměnných o něco složitější. Před PHP 8.3 bychom to mohli udělat jako příklad níže:

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;

Nyní pojďme získat hodnoty pomocí definic tříd a výčtů v příkladu výše v PHP 8.3:

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

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

Nová metoda: getBytesFromString()

Můžeme říci, že tato metoda byla nejvíce neočekávaná mezi funkcemi přidanými v PHP 8.3: Generování náhodného textu pomocí předem schválené kolekce znaků.

Tato nová metoda je velmi jednoduchá a přehledná. Metodě dáváme některé znaky jako zdroje a určujeme, kolik z nich chceme použít. To je vše! Nyní bude naše metoda vracet výsledky s náhodnými znaky, dokud nedosáhne zadané délky. Nyní si to ujasněme na příkladu

$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

Je možné, že výstup bude delší než celková délka námi zadaných znaků. Udělali jsme to v příkladu níže:

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

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

Pokud se všechny znaky, které uvedeme jako parametry, liší, pravděpodobnost, který z nich bude vybrán, je stejná. Můžeme však zajistit, aby se ve výstupu objevilo více stejných znaků přidáním více než jednoho stejného znaku do našeho seznamu podporovaných znaků. To jsme si ukázali na dalším příkladu.

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

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

Nové metody: getFloat() a nextFloat()

V této inovaci PHP 8.3 zavádí dvě nové metody, které rozšiřují náhodné rozšíření PHP: getFloat() a nextFloat().

Příklad těchto metod:

$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

Drobné inovace a vylepšení v PHP 8.3

Kromě výše uvedených inovací má PHP 8.3 desítky dalších drobných vylepšení a inovací. Uvedli jsme je spolu s jejich zdrojovými dokumenty v seznamu níže.

Zastaralé v PHP 8.3

S každou novou verzí PHP je některý kód označen pro ukončení podpory. Nikdy se nedoporučuje používat tyto funkce, jakmile jsou zcela zastaralé. Pokud je použit zastaralý kód, při spuštění kódu se vrátí chybová zpráva.

Seznam ukončení podpory v PHP 8.3:

PHP 8.3

V tomto článku jsme zhodnotili důležité změny a inovace v PHP 8.3. Pro podrobnější seznam všech změn v PHP 8.3 oficiální changelog Doporučujeme vám to zkontrolovat. Pokud chcete upgradovat své kódy nebo stránky z PHP 8.2 na PHP 8.3, může být užitečná tato příručka: PHP 8.3 Migration Guide -> https://www.php.net/manual/en/migration83.php

Pokud se obáváte verzí PHP a migrace, doporučujeme dát nové verzi nějaký čas na upgrade na PHP 8.3.

Úplné pokrytí PHP a JavaScript jazyků a souvisejících technologií jako Onur Özden Web Çözümleri Webový software Nabízíme služby.  Pokud máte dotaz nebo požadavek, můžete nás rychle kontaktovat pomocí tlačítka Whatsapp vlevo dole a získat cenovou nabídku.