Стаття також доступна російською (перейти до перегляду).
Зміст:
У двадцятих числах листопаду 2024 року світ побачив новий реліз PHP 8.4.1, котрий продовжує давню традицію періодичного оновлення популярного препроцесора гіпертексту по всім напрямкам. Дуже багато внесених змін стосувалися ядра системи, зокрема, змінився механізм обробки тіла multipart-запитів, стала можливою робота із віртуальними значеннями властивостей об’єктів, був розширений та вдосконалений механізм маркування застарілих елементів та ще багато іншого. Зміни також торкнулися багатьох модулів та драйверів, зокрема, це поява нового DOM API для ефективного розбору HTML 5 документів, реалізовано хешування паролів на базі алгоритму PASSWORD_ARGON2, оптимізовано механізм керування роботою JIT-компілятору тощо. Нижче будуть розглянуті більш детально головні нововведення та виправлення, котрі з’явилися у новій версії інтерпретатора.
Ядро
Новий функціонал
З’явилася нова функція request_parse_body(). Її головне призначення – розбиття по блокам тіла multipart-запитів, метод котрих відмінний від методу POST. Розбиття буде здійснюватися відповідно до типу даних, визначеного у заголовку Content-Type.
Поява глобальних констант:
PHP_OUTPUT_HANDLER_PROCESSED; PHP_SBINDIR.
Перша з констант «повідомляє» про завершення обробки буферу. Друга використовується для встановлення значення параметру при конфігуруванні ОС, зокрема, Windows.
Здійснено розмежування між областями видимості властивостей об’єктів. Тепер простір видимості властивостей об’єктів не залежить від типу операцій, котрі над ними виконуються. Це, зокрема, зменшує потребу у використанні шаблонних операцій get() функцій при читанні властивостей об’єктів.
Змінився синтаксис конструкцій для звернення до методів та властивостей об’єктів. Одразу після ініціалізації об’єктів при зверненні до їх властивостей та методів тепер можна опускати дужки навколо оператору new.
Приклад:
new PhpVer_php()->getVersion()
Додано підтримку «лінивих» або Lazy об’єктів. Використання «лінивих» об’єктів дає змогу працювати з ними, відтермінувавши при цьому їх ініціалізацію. Така затримка може бути корисною, зокрема, при запуску бібліотек.
$initializer = static function (MyClass $proxy): MyClass { return new MyClass(123); }; $reflector = new ReflectionClass(MyClass::class); $object = $reflector->newLazyProxy($initializer);
Введені аксесуари властивостей (Property hooks) об'єктів. Аксесори дозволяють позбавитися спагетті-коду, працювати з властивостями об'єктів на віртуальному рівні, не зберігаючи постійно їх значення. Це, зокрема, дає можливість виконувати як попередню, і подальшу обробку значень не використовуючи методи get і set.
class User
{
public function __construct(
private string $name,
private string $surname,
) {}
public string $fullName {
get {
return $this->name.' '.$this->surname;
}
}
}
Для властивостей також додано можливість використання в інтерфейсах:Для властивостей також додано можливість використання в інтерфейсах:
class BookViewModel
{
public private(set) Author $author;
}
Додано атрибут #[\Depricated]. Новий атрибут розширює можливості з маркування констант класів, функцій користувача і методів, що стали застарілими. Його використання призводить до заміни видаваного виду помилки на E_USER_DEPRECATED, що містить більш детальний опис.
Поліпшилася якість налагоджувальної інформації про об'єкти класів Closure та WeakReference.
class BookViewModel{
public private(set) Author $author;
}
Додана можливість асиметричної видимості. Це дозволяє робити властивість видимим ґрунтуючись на його контексті.
Приклад:
class BookViewModel{
public private(set) Author $author;
}
і звичайно ж можна використовувати таку конструкцію в promoted властивостях
public function __construct(
private(set) Author $author;
) {}
Інші зміни та виправлення
Змінено принцип формування ідентифікаторів Замикань. Тепер ідентифікатор замикання формується із назви функції вищого рівня та групи символів, котрими воно визначено. Окрім того, корутини(Coroutine) не блокуються під час запуску деструкторів. Це дозволяє у разі потреби здійснювати переключення корутинів.
Вдосконалено механізм керування Обробником виводу. Налагоджено автоматичне очищення інформації про стан Обробника, котра фіксується у параметрі flags функції ob_start(). Змінився параметр для управління функцією перевизначення хостів. Замість параметру session.trans_sid_hosts буде використовуватися url_rewriter.hosts.
Покращилася підтримка ОС Windows. Розширення AVX(2) для MSVC-збірок тепер вірно ідентифікується процесором. Керування збірками, створеними на основі AVX-512 тепер здійснюється за допомогою опції --enable-native-intrinsics.
Змінився тип констант:
PHP_DEBUG; PHP_ZTS.
Константи віднесено до логічного типу даних.
Змінена область значень функцій die() та exit().Тепер вони можуть приймати лише значення із діапазону допустимих значень функції зворотного виклику callable().
Стала неможливою опосередкована зміна значень властивостей об’єктів із read дозволом. Якщо буде відбуватися операція по зміні значення властивості, то це викличе фатальну помилку.
Модулі / Драйвери
Новий функціонал
DOM
Створено новий DOM API для обробки HTML 5 документів. Новий API забезпечує більш зручну роботу з документами та виправляє ряд помилок. Для створення нових документів використовуються наступні класи:
-
Dom\HTMLDocument;
-
Dom\XMLDocument.
Тут ідентифікатор Dom визначає простір імен для нового API.
З’явився новий метод для інтерфейсу Node: compareDocumentPosition().
Метод порівнює положення двох вузлів та повертає бітову маску, утворену із констант типу DOCUMENT_POSITION_*. У відповідності до цього було створено шість нових констант:
_CONTAINS; _FOLLOWING; _PRECEDING; _DISCONNECTED; _CONTAINED_BY; _IMPLEMENTATION_SPECIFIC.
Методи класу XPath registerPhpFunctions() та registerPhpFunctionNs() тепер підтримують функцію зворотного виклику callback().
cURL
Додано константу CURLOPT_PREREQFUNCTION. Приймає значення функції callback(), котра викликається одразу після встановлення з’єднання. В залежності від стану з’єднання значеннями функції можуть бути:
CURL_PREREQFUNC_OK;
-
CURL_PREREQFUNC_ABORT.
Додано константу CURLOPT_DEBUGFUNCTION. Приймає значення функції callback(), котра викликається під час існування запиту. Вона повертає тип повідомлення про результати налагодження програми та саме повідомлення. Тип повідомлення може приймати значення констант із простору CURLINFO_*:
_DATA_IN; _DATA_OUT; _HEADER_IN; _HEADER_OUT; _SSL_DATA_IN; _SSL_DATA_OUT; _TEXT.
Додано нові константи:
CURL_HTTP_VERSION_3; CURL_HTTP_VERSION_3ONLY.
Константи використовуються як значення параметру CURLOPT_HTTP_VERSION для з’єднання по HTTP-протоколу відповідної версії. Доступні для використання, починаючи з версії libcurl 7.66.
Функція curl_version() отримала нове додаткове значення – feature_list. Вказана опція містить масив cURL-функцій. Повертає значення true у випадку підтримки функції або false, якщо ні.
OpenSSL
Реалізовано хешування паролів на базі алгоритму PASSWORD_ARGON2. Умови роботи: наявність версії 3.2 модулю OpenSSL та збірка типу Non Thread Safe.
Додано підтримку ключів, визначених на основі еліптичних кривих Curve448 + Curve25519. Відповідно для їх підтримки до кількох функцій модулю були додані додаткові поля для зберігання нових значень коду. Ось ці функції:
pkey_new(); pkey_get_details(); verify(); sign().
SOAP
З’явилася підтримка специфікації Кларка для області імен. У карті класів тепер можна використовувати записи, котрі перетворюють тип визначеної області імен у певний клас.
Приклад:
'{http://shop.ua}sport' => 'SportClass'.
Для збереження сесій тепер використовується функціонал загального модулю сесій.
XSL
Значення параметрів тепер можуть містити як подвійні, так і одинарні лапки.
PDO
З’явилася підтримка SQL-парсерів, котрі працюють із визначеними драйверами БД. Парсери підтримують літерали у лапках та коментарі двох типів – невкладені та ті, що починаються із символів «--».
Введено нові підкласи, котрі відображають функціональність визначених баз даних. Це зближує їх з драйверами та, відповідно, покращує можливості та якість інтеграції з різними типами БД.
PCRE
До версії 10.44 оновили бібліотеку pcre2lib, котра постачається разом із препроцесором PHP. Бібліотека отримала наступні оновлення:
-
У Perl-сумісних конструкціях стала доступною підтримка перевірок змінної довжини;
-
Максимальна довжина міток груп захвату збільшилась до 128 символів;
-
З’явилася підтримка процесорної архітектури LoongArch JIT-компілятором.
Додана підтримка модифікатору PCRE2_EXTRA_CASELESS_RESTRICT для r та ?r режимів.
Reflection
Додано кілька методів та констант до Lazy-об’єктів.
Для ReflectionClass:
SKIP_DESTRUCTOR; SKIP_INITIALIZATION_ON_SERIALIZE; newLazyProxy(); resetAsLazyProxy(); initializeLazyObject(); getLazyInitializer(); newLazyGhost(); resetAsLazyGhost(); isUninitializedLazyObject(); markLazyObjectAsInitialized().
Для ReflectionProperty:
-
setRawValueWithoutLazyInitialization();
-
skipLazyInitialization().
Клас ReflectionAttribute отримав нову властивість. Властивість name стає у нагоді під час здійснення процесу налагодження програми.
Phar
Додано підтримку модулю відміток часу в ОС Unix для Zip-архівів. Модуль покращує гнучкість та деякі можливості адміністрування.
Стандартні модулі
Додано нове перечисленняRoundingMode. Його переваги порівняно із константами групи PHP_ROUND:
-
Додаткові 4 режими округлення;
-
Покращене виявлення.
PDO_MYSQL
Додано користувацький парсер. Характеристики парсеру:
-
Підтримка трьох типів коментарів – «невкладених», ті що починаються з символів «--», ті що починаються з символу «#»;
-
Підтримка літералів із обома типами лапок та символами екранування;
-
Підтримка літеральних ідентифікаторів зі зворотними апострофами або лапками та подвоєнням у якості засобу екранування.
Інші зміни та виправлення
Opcache. Змінився спосіб керування режимами роботи JIT-компілятору. Тепер режим роботи JIT-компілятору вказується у директиві opcache.jit за допомогою значень tracing / disable. Як і раніше, за замовчуванням компілятор вимкнено.
OpenSSL. Усунено помилки у роботі функції openssl_csr_new(). Раніше параметр extra_attributes функції приймав значення лише унікального DN-імені об’єкту. Зараз у якості значення встановлюється ключ типу CSR(Certificate Signing Request).
LibXML. Внесено зміни до алгоритму роботи функції libxml_set_streams_context().При отриманні функцією значення, котре не пов’язане із потоковою передачею, одразу ж викидується помилка (виключення) TypeError.
Типізація констант у класах. Для модулів PDO, XMLReader, Date, Reflection, Sqlite, SPL, та Intl у власних класах тепер необхідно оголошувати тип констант.
DBA. Відбулася зміна типів об’єктів, що приймаються / повертаються функціями. Тепер замість ресурсних значень dba_connection приймаються / повертаються лише об’єкти типу Dba\Connection.
FREEhost.UA перший хостинг в Україні, який почав надавати віртуальний хостинг з PHP 8.4. Замовляйте хосинг зараз і починайте тестувати свої додатки з новою версією PHP.
Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.
Дивіться наш канал Youtube на https://www.youtube.com/freehostua.
Ми у чомусь помилилися, чи щось пропустили?
Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.
Дата: 09.12.2024 Автор: Олександр Ровник
|
|
Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами: