PHP е скриптов език, използван от голям брой потребители за целите на уеб разработката. Най-новата стабилна и актуализирана версия на PHP, 8.3, беше пусната на 23.11.2023 г. Има много иновации и промени след PHP 3.x, издаден през 2000 г. PHP все още е сред най-популярните езици за уеб разработка (уеб дизайн), използвани от много голяма аудитория. В тази статия ще разгледаме и анализираме иновациите и промените в PHP 8.3 с примерни кодове.

PHP 8.3 Основни нови функции и подобрения

Има много големи нововъведения и подобрения в PHP 8.3 в сравнение с предишната версия на PHP, PHP 8.2. В същото време някои функции са отхвърлени. Сега ще разгледаме иновациите и подобренията едно по едно с примерни кодове.

Типизирани класови константи

Декларирането на тип е много важна функция за разработчиците, която повишава стабилността и намалява процента на грешки в уеб разработката. Функцията за деклариране на тип за свойства в клас беше добавена в PHP 7.4. Въпреки че в по-късните версии бяха направени много подобрения на тази функция, тази функция все още не беше налична за константи в класа. С PHP 8.3 вече е възможно да се декларират типове за константи в класовете.

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

Някои декларации на типове не се поддържат за константи на класа.

Неподдържани типове декларации за класови константи: void, callable, never

Нова функция: json_validate()

Когато работим с данни в JSON формат (json-кодирани данни), трябва да проверим дали входящите данни са валидни, преди да ги използваме. Правехме това във версии преди PHP 8.3, използвайки следните или подобни методи.

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

В този стар пример, когато валидира JSON данни, PHP може да консумира значителна памет в зависимост от размера на данните. В PHP 8.3 беше добавена нова PHP функция, която създава бързо решение, ориентирано към производителността: json_validate(). По-долу сме илюстрирали сценария на използване на тази функция.

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

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

Нова функция: #[Override]

Когато внедряваме интерфейси в PHP, ние предоставяме подробна функционалност за методите в интерфейса. Когато създаваме екземпляр на клас, можем да заменим родителски метод, като създадем алтернативна версия със същото име и съвместим подпис. Това може да причини сериозни проблеми в софтуера. Накратко, проблемът е, че смятаме, че сме заменили главния метод в резултат на малка пренебрегната печатна грешка.

Функцията #[Override] на PHP 8.3 предоставя решение за този проблем. Сега нека видим това в примера.

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

Дълбоко клониране на свойства само за четене

PHP въведе възможността за деклариране на свойства на отделни класове като само за четене в PHP 8.1 и присвояването им на целия клас в PHP 8.2. Повечето уеб разработчици обаче смятат, че ограниченията, наложени при работа с класове, съдържащи такива функции, възпрепятстват практичността в логиката на програмиране.

За да промените това RFC Бяха направени две основни препоръки:

само за четене

  1. readonly позволяващи класове, които не са разрешени за разширяване
  2. readonly позволяващи функциите да бъдат рестартирани по време на клониране

Второто предложение беше включено в PHP 8.3. Този нов подход е добавен към PHP 8.3 readonly екземпляри на клас със свойстваreadonly свойства) __clone Позволява да бъде рестартиран с неговия магически метод.

Този примерен код от RFC може да ни помогне да разберем как работи този нов метод:

Динамично извличане на класови константи и членове на Enum

За разлика от други функции в PHP, улавянето на класови константи и enum членове с имена на променливи е малко по-сложно. Преди PHP 8.3 можехме да направим това като примера по-долу:

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;

Сега, нека получим стойностите, използвайки дефинициите на клас и enum в примера по-горе в PHP 8.3:

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

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

Нов метод: getBytesFromString()

Можем да кажем, че този метод беше най-неочакваният сред функциите, добавени в PHP 8.3: Генериране на произволен текст с помощта на предварително одобрена колекция от знаци.

Този нов метод е много прост и ясен. Даваме някои символи на метода като ресурси и указваме колко от тях искаме да използваме. Това е всичко! Сега нашият метод ще върне резултати с произволни знаци, докато достигне определената дължина. Сега нека изясним това с пример

$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

Възможно е изходът да е по-дълъг от общата дължина на символите, които сме посочили. Направихме това в примера по-долу:

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

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

Ако всички знаци, които даваме като параметри са различни, вероятността кой ще бъде избран е еднаква. Въпреки това, можем да накараме повече от един и същи знак да се появи в изхода, като добавим повече от един от един и същи знак към нашия списък с поддържани знаци. Показахме това в следващия пример.

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

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

Нови методи: getFloat() и nextFloat()

В тази иновация PHP 8.3 въвежда два нови метода, които разширяват произволното разширение на PHP: getFloat() и nextFloat().

Пример за тези методи:

$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

Незначителни нововъведения и подобрения в PHP 8.3

В допълнение към горните нововъведения, PHP 8.3 има десетки други малки подобрения и нововъведения. Изброили сме ги заедно с изходните им документи в списъка по-долу.

Отхвърлено в PHP 8.3

С всяка нова версия на PHP, част от кода се маркира за отмяна. Никога не се препоръчва използването на тези функции, след като бъдат напълно отхвърлени. Ако се използва остарял код, ще бъде върнато съобщение за грешка, когато кодът се изпълни.

Списък на отхвърлените в PHP 8.3:

PHP 8.3

В тази статия прегледахме важните промени и нововъведения в PHP 8.3. За по-подробен списък на всички промени в PHP 8.3 официален регистър на промените Препоръчваме ви да го прегледате. Ако искате да надстроите своите кодове или сайт от PHP 8.2 до PHP 8.3, това ръководство може да ви е полезно: Ръководство за миграция към PHP 8.3 -> https://www.php.net/manual/en/migration83.php

Ако се притеснявате за PHP версиите и миграцията, препоръчваме да дадете известно време на новата версия, за да надстроите до PHP 8.3.

Пълно покритие на PHP и JavaScript езици и свързани технологии като Onur Özden Web Çözümleri Уеб софтуер Предлагаме услуги.  Ако имате въпрос или заявка, можете бързо да се свържете с нас чрез бутона Whatsapp долу вляво, за да получите оферта.