PHP to język skryptowy używany przez dużą liczbę użytkowników do celów tworzenia stron internetowych. Najnowsza stabilna i zaktualizowana wersja PHP 8.3 została wydana 23.11.2023. Od czasu wydania PHP 3.x w 2000 roku wprowadzono wiele innowacji i zmian. PHP jest nadal jednym z najpopularniejszych języków tworzenia stron internetowych (projektowania stron internetowych), z którego korzysta bardzo duża publiczność. W tym artykule zbadamy i przeanalizujemy innowacje i zmiany w PHP 8.3 z przykładami kodu.

PHP 8.3 Główne nowe funkcje i ulepszenia

W PHP 8.3 wprowadzono wiele istotnych innowacji i ulepszeń w porównaniu z poprzednią wersją PHP, PHP 8.2. Jednocześnie niektóre funkcje zostały uznane za przestarzałe. Przeanalizujemy teraz innowacje i ulepszenia jedna po drugiej z przykładami kodu.

Wpisane stałe klasy

Deklarowanie typu jest bardzo ważną funkcją dla programistów, która zwiększa stabilność i zmniejsza liczbę błędów podczas tworzenia stron internetowych. Funkcja deklaracji typu dla właściwości w klasie została dodana w PHP 7.4. Chociaż w późniejszych wersjach wprowadzono wiele ulepszeń tej funkcji, funkcja ta nadal nie była dostępna dla stałych w tej klasie. W PHP 8.3 możliwe jest teraz deklarowanie typów stałych w klasach.

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

Niektóre deklaracje typów nie są obsługiwane w przypadku stałych klas.

Nieobsługiwane deklaracje typów stałych klas: void, callable, never

Nowa funkcja: json_validate()

Pracując z danymi w formacie JSON (dane zakodowane w formacie JSON), przed ich użyciem musimy sprawdzić, czy przychodzące dane są prawidłowe. Robiliśmy to w wersjach wcześniejszych niż PHP 8.3, używając następujących lub podobnych 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
}

W tym starym przykładzie podczas sprawdzania poprawności danych JSON PHP może zużywać znaczną ilość pamięci, w zależności od rozmiaru danych. W PHP 8.3 dodano nową funkcję PHP, która tworzy szybkie rozwiązanie zorientowane na wydajność: json_validate(). Poniżej przedstawiliśmy przykładowy scenariusz użycia tej funkcji.

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

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

Nowa funkcja: #[Zastąpienie]

Implementując interfejsy w języku PHP, zapewniamy szczegółową funkcjonalność metod znajdujących się w interfejsie. Tworząc instancję klasy, możemy zastąpić metodę nadrzędną, tworząc alternatywną wersję o tej samej nazwie i zgodnym podpisie. Może to spowodować poważne problemy w oprogramowaniu. Krótko mówiąc, problem polega na tym, że naszym zdaniem zastąpiliśmy metodę główną w wyniku małej przeoczonej literówki.

Funkcja #[Override] w PHP 8.3 zapewnia rozwiązanie tego problemu. Zobaczmy to teraz na przykładzie.

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

Głębokie klonowanie właściwości tylko do odczytu

PHP wprowadziło możliwość deklarowania właściwości poszczególnych klas jako tylko do odczytu w PHP 8.1 i przypisywania ich do całej klasy w PHP 8.2. Jednak większość twórców stron internetowych uważała, że ​​ograniczenia nałożone podczas pracy z klasami zawierającymi takie funkcje uniemożliwiają praktyczność logiki programowania.

Aby to zmienić RFC Podano dwa główne zalecenia:

tylko do odczytu

  1. readonly dopuszczenie zajęć, których nie wolno przedłużać
  2. readonly umożliwiając ponowne uruchomienie funkcji podczas klonowania

Druga sugestia została uwzględniona w PHP 8.3. To nowe podejście zostało dodane do PHP 8.3 readonly instancje klasy z właściwościamireadonly właściwości) __clone Pozwala na ponowne uruchomienie za pomocą magicznej metody.

Ten przykładowy kod z RFC może pomóc nam zrozumieć, jak działa ta nowa metoda:

Dynamiczne pobieranie stałych klas i elementów wyliczeniowych

W przeciwieństwie do innych funkcji PHP, przechwytywanie stałych klas i elementów wyliczeniowych z nazwami zmiennych jest nieco bardziej skomplikowane. Przed PHP 8.3 mogliśmy to zrobić jak w poniższym przykładzie:

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;

Teraz uzyskajmy wartości, korzystając z definicji klas i wyliczeń z powyższego przykładu w PHP 8.3:

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

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

Nowa metoda: getBytesFromString()

Można powiedzieć, że ta metoda była najbardziej nieoczekiwana spośród funkcji dodanych w PHP 8.3: Generowanie losowego tekstu przy użyciu wstępnie zatwierdzonego zbioru znaków.

Ta nowa metoda jest bardzo prosta i przejrzysta. Nadajemy metodzie niektóre znaki jako zasoby i określamy, ile z nich chcemy wykorzystać. To wszystko! Teraz nasza metoda będzie zwracać wyniki z losowymi znakami, aż osiągną określoną długość. Teraz wyjaśnijmy to na przykładzie

$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

Możliwe jest, że wynik będzie dłuższy niż całkowita długość określonych przez nas znaków. Zrobiliśmy to w poniższym przykładzie:

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

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

Jeśli wszystkie znaki, które podajemy jako parametry są różne, prawdopodobieństwo, który z nich zostanie wybrany, jest równe. Możemy jednak sprawić, że na wyjściu pojawi się więcej tego samego znaku, dodając więcej niż jeden taki sam znak do naszej listy obsługiwanych znaków. Pokazaliśmy to w następnym przykładzie.

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

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

Nowe metody: getFloat() i nextFloat()

W tej innowacji PHP 8.3 wprowadza dwie nowe metody rozszerzające losowe rozszerzenie PHP: getFloat() i nextFloat().

Przykład tych 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

Drobne innowacje i ulepszenia w PHP 8.3

Oprócz powyższych innowacji, PHP 8.3 zawiera dziesiątki innych drobnych ulepszeń i innowacji. Zestawiliśmy je wraz z dokumentami źródłowymi w poniższej liście.

Przestarzałe w PHP 8.3

Z każdą nową wersją PHP część kodu jest oznaczana jako przestarzała. Nigdy nie zaleca się używania tych funkcji, gdy są one całkowicie przestarzałe. Jeśli zostanie użyty przestarzały kod, po wykonaniu kodu zostanie zwrócony komunikat o błędzie.

Lista przestarzałych wersji PHP 8.3:

PHP 8.3

W tym artykule dokonaliśmy przeglądu ważnych zmian i innowacji w PHP 8.3. Bardziej szczegółową listę wszystkich zmian w PHP 8.3 oficjalny dziennik zmian Zalecamy zapoznanie się z nim. Jeśli chcesz zaktualizować swoje kody lub witrynę z PHP 8.2 do PHP 8.3, ten przewodnik może być przydatny: Przewodnik migracji PHP 8.3 -> https://www.php.net/manual/en/migration83.php

Jeśli martwisz się wersjami PHP i migracją, zalecamy dać nowej wersji trochę czasu na aktualizację do PHP 8.3.

Pełne pokrycie języków PHP i JavaScript oraz powiązanych technologii jako Onur Özden Web Çözümleri Oprogramowanie internetowe Oferujemy usługi.  Jeśli masz pytanie lub prośbę, możesz szybko skontaktować się z nami za pomocą przycisku Whatsapp w lewym dolnym rogu, aby otrzymać wycenę.