PHP — це мова сценаріїв, яка використовується великою кількістю користувачів для веб-розробки. Остання стабільна та оновлена ​​версія PHP, 8.3, була випущена 23.11.2023. Після PHP 3.x, випущеного в 2000 році, відбулося багато інновацій і змін. PHP все ще залишається однією з найпопулярніших мов веб-розробки (веб-дизайну), якою користується дуже велика аудиторія. У цій статті ми розглянемо та проаналізуємо нововведення та зміни в PHP 8.3 на прикладах коду.

PHP 8.3 Основні нові функції та вдосконалення

Порівняно з попередньою версією PHP, PHP 8.2, у PHP 8.3 є багато основних нововведень і покращень. У той же час деякі функції застаріли. Тепер ми розглянемо інновації та вдосконалення по черзі з прикладами коду.

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

Оголошення типу є дуже важливою функцією для розробників, яка підвищує стабільність і зменшує кількість помилок у веб-розробці. Функцію оголошення типу для властивостей у класі було додано в 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
}

Нова функція: #[Перевизначити]

Під час реалізації інтерфейсів у PHP ми надаємо детальну функціональність для методів в інтерфейсі. Під час створення екземпляра класу ми можемо перевизначити батьківський метод, створивши альтернативну версію з таким самим ім’ям і сумісним підписом. Це може спричинити серйозні проблеми з програмним забезпеченням. Коротше кажучи, проблема полягає в тому, що ми вважаємо, що перевизначили основний метод через невелику помилку, яку ми не помітили.

PHP 8.3 #[Override] функція надає рішення для цієї проблеми. Тепер розглянемо це на прикладі.

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 8.1 у PHP з’явилася можливість оголошувати властивості окремих класів як тільки для читання, а в PHP 8.2 — призначати їх усьому класу. Однак більшість веб-розробників вважали, що обмеження, накладені на роботу з класами, що містять такі функції, перешкоджають практичності логіки програмування.

Щоб змінити це RFC Було зроблено дві основні рекомендації:

тільки для читання

  1. readonly дозвіл на заняття, які не можна продовжувати
  2. readonly дозволяючи перезапускати функції під час клонування

Друга пропозиція була включена в PHP 8.3. Цей новий підхід додано до PHP 8.3 readonly екземпляри класу з властивостямиreadonly властивості) __clone Це дозволяє його перезапустити за допомогою магічного методу.

Цей приклад коду з RFC може допомогти нам зрозуміти, як працює цей новий метод:

Динамічне отримання констант класу та членів Enum

На відміну від інших функцій у PHP, захоплення констант класу та членів переліку з іменами змінних є трохи складнішим. До 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;

Тепер давайте отримаємо значення, використовуючи визначення класу та переліку в наведеному вище прикладі в 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 Migration Guide -> https://www.php.net/manual/en/migration83.php

Якщо вас турбують версії PHP і міграція, ми рекомендуємо дати новій версії деякий час для оновлення до PHP 8.3.

Повне охоплення PHP і JavaScript мов і пов’язаних технологій як Onur Özden Web Çözümleri Веб-програмне забезпечення Ми пропонуємо послуги.  Якщо у вас є запитання чи прохання, ви можете швидко зв’язатися з нами за допомогою кнопки Whatsapp унизу ліворуч, щоб отримати ціну.