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

Вступ
- Внесення змін до readonly RFC
- Атрибут RFC дозволяє перекривати методи
- Зміна поведінки від'ємних індексів у масивах
- Розширення підтримки анонімних readonly класів
- Нова функція json_validate()
- Розширення класу Randomizer
- Динамічне отримання констант класу
- Зміна поведінки винятків дати/часу RFC
- Зміни у функції Range()
- Зміни до властивостей класів та статичних властивостей
- Пропозиції щодо виявлення переповнення стеку
- Нова функція mb_str_pad RFC
- Магічні методи і не тільки
- Порушення видимості незмінної константи
- Невеликі deprecated
Реліз 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