• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Стаття також доступна російською (перейти до перегляду).

Реліз PHP 8.3: детальний огляд

Вступ

Реліз PHP 8.3 відбувся 23 листопада 2023 року. Нова версія включає ряд нових функцій та можливостей, які роблять PHP ще більш потужним та ефективним інструментом для розробки веб-додатків. І звісно, нова версія PHP стала працювати швидше за попередні :)

Розглянемо кожне оновлення з прикладами для кращого розуміння.

Внесення змін до readonly RFC

Однією з ключових змін є розширення використання "readonly" у класах. Тепер дозволяється переініціалізувати властивості "readonly" під час клонування. Наприклад:

readonly class Post {
    public function __construct(
        public DateTime $createdAt,
    ) {}

    public function __clone() {
        $this->createdAt = new DateTime(); 
        // Тепер можна переініціалізувати readonly властивість під час клонування.
    }
}

Атрибут RFC дозволяє перекривати методи

Додано новий атрибут #[Override], який використовується для вказівки наміру програміста. Наприклад:

abstract class Parent {
    public function defaultImplementation(): string {
        return ‘text 1’;
    }
}

final class Child extends Parent {
    #[Override]
    public function defaultImplementation(): string {
        return ‘test 2’; // Перевизначений метод
    }
}

Цей атрибут дозволяє виявляти зміни в іменах методів у батьківському класі та гарантує їх відповідність в похідних класах.

Зміна поведінки від'ємних індексів у масивах

У попередніх версіях PHP, при додаванні елемента з від'ємним індексом в порожній масив і наступному додаванні іншого елемента, другий завжди починався з індексу 0. У PHP 8.3 це змінено, і наступний елемент додається з індексом -4:

$array = [];

$array[-3] = val1';
$array[] = 'val2';

var_export($array);
// array (
//   -3 => 'val1',
//   -2 => 'val2',
// )

Розширення підтримки анонімних readonly класів

В PHP 8.3 додана підтримка вказання "readonly" для анонімних класів:

$class = new readonly class {
    public function __construct(
        public string $prop = 'value',
    ) {}
};

Нову функція json_validate()

Додано нову функцію json_validate(), яка дозволяє перевіряти, чи є рядок дійсним JSON, без його декодування:

$jsonString = '{"name":"John","age":30,"city":"New York"}';

if (json_validate($jsonString)) {
    echo "Valid JSON!";
} else {
    echo "Invalid JSON!";
}

Це корисно, якщо потрібно лише перевірити правильність формату JSON.

Розширення класу Randomizer

У PHP 8.3 розширено клас Randomizer, шляхом додавання нових методів для генерації випадкових даних:

// Генерація рядка із випадково вибраними байтами з іншого рядка
Randomizer::getBytesFromString(string $string, int $length): string

// Генерація випадкового числа з плаваючою комою у заданому діапазоні
Randomizer::getFloat(float $min, float $max, IntervalBoundary $boundary = IntervalBoundary::ClosedOpen): float

// Генерація випадкового числа з плаваючою комою від 0 до 1 (виключаючи 1)
Randomizer::nextFloat(): float

Ці методи розширюють можливості генерації випадкових значень у PHP.

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

У новій версії дозволяється отримання констант класу за допомогою більш динамічного синтаксису:

class Cl {
    const DATA = 'value';
}

$name = 'DATA';

// Замість цього:
constant(Cl::class . '::' . $name);

// Тепер можна використовувати це:
Cl::{$name};

Зміна поведінки винятків дати/часу RFC

Додано нові винятки для роботи з датою і часом, що дозволяє краще обробляти помилки. Наприклад:

try {
    // Деяка операція з датою або часом, що призводить до помилки
} catch (DateMalformedIntervalStringException $e) {
    // Обробка помилок з невірними інтервалами
} catch (DateInvalidOperationException $e) {
    // Обробка інших помилок з датою та часом
} catch (DateRangeError $e) {
    // Обробка помилок з невірними діапазонами
}

Це робить обробку помилок у операціях з датою та часом більш точною та зрозумілою.

Зміни у функції Range()

Внесені зміни до функції range(). Це, зокрема, перевірка на від'ємність параметрів, яка тепер видає помилку TypeError, а також відображення різних сценаріїв використання.

// Перевірка на від'ємний $step
range(1, 10, -1); // Тепер видає помилку TypeError

Зміни до властивостей класів та статичних властивостей

Зміни в роботі трейтів із статичними властивостями тепер можуть призводити до повторного визначення статичних властивостей, успадкованих від батьківського класу.

trait MyTrait {
    public static $myStaticProperty = 'value';
}

class ParentClass {
    use MyTrait;
}

class ChildClass extends ParentClass {
    use MyTrait;
    // Призводить до повторного визначення статичної властивості $myStaticProperty
}

Пропозиції щодо виявлення переповнення стеку

Додано можливість виявлення переповнення стеку за допомогою нових директив в php.ini. Це полегшує відлагодження програм, що наближаються до переповнення стеку.

; Налаштування для виявлення переповнення стеку
zend.max_allowed_stack_size=128K

Це робить виявлення переповнення стеку менш проблематичним.

Нова функція mb_str_pad RFC

Додано нову функцію mb_str_pad(), яка працює аналогічно до функції str_pad(), але підтримує мультибайтові рядки:

function mb_str_pad(
    string $string, 
    int $length, 
    string $pad_string = " ", 
    int $pad_type = STR_PAD_RIGHT, 
    ?string $encoding = null,
): string {}

Ця функція корисна при роботі з рядками, кодування яких використовує мультибайтові символи (такі як UTF-8).

Магічні методи і не тільки

До релізу можна було викликати магічні методи лише безпосередньо на об'єкті. Однак з PHP 8.3 тепер можливо створювати замикання з магічних методів. Це означає, що є можливість зберігати магічний метод у змінній, а потім викликати його пізніше, не посилаючись на об'єкт.

$object = new MyClass();
$closure = $object->magic(...);

Метод magic() може бути будь-яким магічним методом, таким як __call(), __callStatic(), __get() або __set(). Синонім ... дозволяє передавати будь-яку кількість аргументів до магічного методу.

Після створення замикання з магічного методу можна передавати йому аргументи з іменами.

$closure('name' => 'John', 'age' => 30);

Це викликає замикання з двома аргументами: 'name' => 'John' і 'age' => 30'.

Порушення видимості незмінної константи

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

interface I {
    public const FOO = 'foo';
}

class C implements I {
    private const FOO = 'foo';
}

У цьому прикладі інтерфейс I оголошує публічну константу FOO, яка має значення "foo". Клас C реалізує інтерфейс I, але також оголошує свою власну приватну константу FOO. У PHP 8.3 це призведе до помилки, оскільки приватна константа FOO не відповідає видимій публічній константі FOO в інтерфейсі I.
Щоб уникнути помилки, можна змінити видимість приватної константи FOO у класі C на публічну:

class C implements I {
    public const FOO = 'foo';
}

Це дозволить класу C відповідати видимості публічної константи FOO в інтерфейсі I.

Невеликі deprecated

Як завжди в кожному випуску, в PHP 8.3 було прийнято кілька deprecated. Ці deprecated не є помилками, а насправді вони корисні для розвитку мови. Ось застаріння, які були прийняті в PHP 8.3:

  • Передача негативного значення $widths до mb_strimwidth()
  • Видалення константи NumberFormatter::TYPE_CURRENCY
  • Видалення непрацюючої реалізації Mt19937 до PHP 7.1 (MT_RAND_PHP)
  • Видалення виклику ldap_connect() з двома параметрами $host і $port
  • Видалення залишків тверджень коду, оцінених як рядки.

PHP 8.3 – це значне оновлення, яке пропонує ряд нових функцій та можливостей. Вони роблять мову ще більш потужною та ефективнішою.

Доречі, нова версія PHP вже доступна на нашому віртуальному хостингу. Замовити хостинг з PHP 8.3 ви можете вже зараз!

Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.

Дивіться наш канал Youtube на https://www.youtube.com/freehostua.

Ми у чомусь помилилися, чи щось пропустили?

Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.

Дата: 29.11.2023
Автор: Сергій Носенко
Голосування

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:

comments powered by Disqus
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA