PHP 8.2: Що очікувати (Посібник для розробників – Оновлено)

by Jason Cosper
PHP 8.2: Що очікувати (Посібник для розробників – Оновлено) thumbnail

Очікується, що PHP 8.2 буде випущено в листопаді цього року, при цьому найновішою стабільною версією є PHP 8.1.5. Хоча процес ще на ранній стадії, вже є змішані відгуки щодо сумісності PHP 8.2 та ядра WordPress, плагінів і тем.

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

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

Огляд версій PHP

PHP є основною мовою програмування WordPress. Він відіграє важливу роль у перетворенні даних з вашої бази даних у HTML веб-сторінки для відвідувачів вашого сайту.

Як власник сайту або розробник, ви, ймовірно, вже знайомі з важливістю оновлення вашого основного WordPress, тем і плагінів. Однак також критично важливо оновлювати ваш PHP.

Наразі WordPress рекомендує використовувати принаймні PHP 7.4. Старі версії PHP більше не отримують активну підтримку для оновлень безпеки та виправлень помилок. Тому, оновлення до останньої стабільної версії PHP може призвести до кращої безпеки сайту, підвищеної продуктивності та вищих рівнів підтримки (ми підкреслюємо стабільна, оскільки частина з 60,000+ Plugins/plugin WordPress ще не повністю сумісні з PHP 8.0, тому до цих оновлень слід підходити з обережністю).

PHP 7.4 ввів типізовані властивості, числовий розділювач з підкресленням та різні покращення. З того часу було випущено ще кілька ітерацій PHP.

PHP 8.0, випущений у листопаді 2020 року, приніс низку суттєвих функцій. Окрім покращення синтаксису та продуктивності, реліз включав:

  • Іменовані параметри
  • Відповідність синтаксису
  • Об’єднання типів
  • Промоція властивостей конструктора
  • JIT (що впливає на виконання вихідного коду PHP)

Через рік з’явився PHP 8.1, остання основна версія PHP. Це оновлення включає значущі функції, такі як:

  • Типи перетину
  • Властивості тільки для читання
  • Перелічення
  • Волокна
  • Тип повернення “николи”

Залишатися на вершині останніх версій PHP може допомогти підвищити продуктивність та безпеку вашого веб-сайту. Однак, важливо знати, яких змін слід очікувати перед оновленням. Якщо вас цікавить тестування поточного стану PHP 8.2, ви можете зробити це через GitHub.

Що нового в PHP 8.2

Очікується, що PHP 8.2 буде випущено наприкінці 2022 року. Ось поточний графік випуску, з загальною доступністю (GA), запланованою на 24 листопада 2022 року:

  • 9 червня: Alpha 1
  • 23 червня: Alpha 2
  • 7 липня: Alpha 3
  • 19 липня: Заморожування функцій
  • 21 липня: Beta 1
  • 4 серпня: Beta 2
  • 18 серпня: Beta 3
  • 1 вересня: Кандидат на випуск 1
  • 15 вересня: Кандидат на випуск 2
  • 29 вересня: Кандидат на випуск 3
  • 13 жовтня: Кандидат на випуск 4
  • 27 жовтня: Кандидат на випуск 5
  • 10 листопада: Кандидат на випуск 6
  • 24 листопада: GA

Згідно з офіційною документацією на сайті PHP, повинно з’явитися кілька нових функцій та застарілих функцій. Давайте розглянемо деякі з них!

Типи диз’юнктивної нормальної форми (DNF)

PHP 8.2 буде вводити нову Диз’юнктивну Нормальну Форму (DNF) типів. DNF це стандартизований спосіб організації булевих виразів — зокрема, до серії AND, об’єднаних OR. Коли DNF застосовується до декларацій типів, це дозволяє стандартний спосіб запису комбінованих Union та Intersection типів, які може обробляти парсер.

Нова функція mysqli_execute_query та метод mysqli::execute_query

Виконання параметризованих запитів MySQLi буде легшим у PHP 8.2, завдяки новій функції mysqli_execute_query($sql, $params) та методу mysqli::execute_query.

Це ще більше знизить складність використання параметризованих запитів, що в свою чергу полегшить розробникам відмову від mysqli_query() а також від небезпечного/ризикованого екранування значень користувачів.

Отримання властивостей перелічення в константних виразах

Згідно з RFC, “Ця RFC пропонує дозволити використання ->/?-> для отримання властивостей перечислень у постійних виразах. Основною мотивацією для цієї зміни є можливість отримання властивостей імені та значення в місцях, де об’єкти перечислень не дозволені, таких як ключі масивів.”

Нове Випадкове Розширення

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

Розширення random постачається з PHP, і не існує опції конфігурації в час компіляції чи виконання для відключення розширення random. Розширення random завжди буде доступне у PHP 8.2 та пізніше.

Нова функція curl_upkeep

PHP 8.2 додає нову функцію до розширення Curl під назвою curl_upkeep. Функція curl_upkeep викликає curl_easy_upkeep() у libcurl, яка є основною бібліотекою C, що використовується розширенням PHP Curl.

Функція curl_upkeep() виконує роботу, яка підтримує Curl-з’єднання в активному стані. Однак не кожен тип з’єднання, який інтегрує Curl, підтримує підтримку з’єднання. Наразі це підтримують лише з’єднання HTTP/2.

Нова функція ini_parse_quantity

ini_parse_quantity — це нова функція, яка буде додана до PHP у версії PHP 8.2. Вона аналізує будь-який розмір даних, який розпізнається у значеннях PHP INI (таких як 56K, 256M або 1G), а потім повертає розмір даних у байтах. Це може бути корисним при аналізі існуючих або наданих значень INI у PHP-додатках. Однак, вона не розпізнає суфікси IEC для розмірів даних, такі як MB, MiB чи GB, і не підходить для перетворення стандартних розмірів даних у байти.

Нова функція memory_reset_peak_usage

PHP 8.2 включатиме нову функцію під назвою memory_reset_peak_usage. Вона скидатиме пікове використання пам’яті, повернуте функцією memory_get_peak_usage.

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

Отримуйте вміст безпосередньо у свою скриньку

Підпишіться зараз, щоб отримувати всі останні оновлення безпосередньо у свою скриньку.

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

Запроваджено у PHP 8.1, властивості readonly будуть розширені у PHP 8.2 для додавання синтаксичного цукру, так що всі властивості класу відразу стануть readonly:

readonly class Post
{
public function __construct(
public string $title,
public Author $author,
public string $body,
public DateTime $publishedAt,
) {}
}

Це запобіжить додаванню динамічних властивостей до класів.

Null, True та False як самостійні типи

У PHP 8.2 тип повернення false буде доступний як самостійний тип, а не лише як об’єднаний тип для випадків, коли виникає помилка, що вже можливо:

function alwaysFalse(): false
{
return false;
}

Те ж саме стосується типу null. Наприклад, як самостійного типу, на відміну від раніше, NullPost::getAuthor() тепер зможе повертати тільки null.

PHP 8.2 також дозволяє використовувати true як самостійний тип.

Застарілі динамічні властивості

Динамічні властивості будуть застарілими у PHP 8.2, що призведе до ErrorException у PHP 9.0. Ці властивості встановлюються на об’єкт:

class Post
{
public string $title;
}

// …

$post->name = 'Назва';

Динамічні властивості забезпечують гнучкість при створенні класів (наприклад, об’єкти значень) без суворого оголошення класу. Їх застаріння, ймовірно, стане проблемою для розробників, які покладаються на динамічні властивості, оскільки це спонукатиме їх більше орієнтуватися на статичний аналіз. З цієї причини деякі розробники стурбовані цією зміною у PHP 8.2.

Однак класи, які використовують __get і __set, все ще підтримуватимуть динамічні властивості, як і об’єкти stdClass.

Альтернативно, розробники можуть використовувати новий #[AllowDynamicProperties]attribute, оголошений у глобальному просторі імен, у класах для цих властивостей:

#[AllowDynamicProperties]
class User() {}
$user = new User();
$user->foo = 'bar';

Хоча це не рекомендується, іншим варіантом є відключення попереджень про застарілість.

Новий /n модифікатор

PHP 8.2 включатиме підтримку модифікатора /n (без захоплення) для сімейства функцій preg_*. При його використанні будь-які групи з мета-символами () не будуть захоплюватися, за винятком іменованих захоплених груп. По суті, результат буде таким самим, як якщо б кожну групу позначили як незахоплюючу.

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

Замаскувати параметри в зворотних трасуваннях

Багато розробників використовують сервіси, які відстежують стеки викликів та помилки у виробництві з баз кодів. Ці сервіси можуть повідомляти користувачів, коли щось йде не так. Наприклад, відстеження стеків викликів корисне при відладці додатка.

Однак, іноді стек-трейси можуть містити конфіденційну інформацію, таку як імена користувачів та паролі. PHP 8.2 включатиме #[SensitiveParameter] атрибут, який запобігатиме включенню цієї інформації в стек-трейси, коли щось піде не так:

function test(
$foo,
#[SensitiveParameter] $bar,
$baz
) {
throw new Exception('Error');
}

test('foo', 'bar', 'baz');

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

Застаріла ${} інтерполяція рядків

Існує кілька способів вбудовування змінних у рядки за допомогою PHP. Однак, PHP 8.2 застаріє два методи. Перший — це використання ${} у рядках:

"Привіт ${world}";

Другий спосіб – використання ${} (змінні змінні):

"Привіт ${(world)}";

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

Відмова від частково підтримуваних викликів

Ще одна застаріла зміна буде пов’язана з частково підтримуваними викликами. Існує кілька способів створення виклику в PHP. Його можна викликати з параметрами або без них за допомогою синтаксису $callable(), user_call_func(/a_array), або використовуючи функцію з колбеком.

Застарілі викликаючі шаблони включають наступне:

$callable = "self::method";
$callable = "parent::method";
$callable = "static::method";
$callable = ["self", "method"];
$callable = ["parent", "method"];
$callable = ["static", "method"];
$callable = ["MyClass", "MyParentClass::myMethod"];
$callable = [new MyClass(), "MyOtherClass::myMethod"];

Починаючи з PHP 8.2, виклик будь-якого з вищезазначених призведе до наступного повідомлення про застарівання:

class Test {
public static function myMethod(): void {
echo "Called";
}
public static function call(): void {
$callable = 'self::myMethod';
call_user_func($callable);
}
}
$callable = Test::call();
// "Called";

Однак, передача цих викликних об’єктів до функції is_callable або їх використання з типами параметрів, що допускають виклик, не викличе повідомлення про застарівання. Щоб уникнути повідомлення про застарівання, розробники можуть замість цього перетворити ключові слова parent, self і static у викликному коді на відповідні назви класів за допомогою магічного методу::class.

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

MySQLi більше не може компілюватися з libmysql

У минулому PHP підтримував дві бібліотеки для з’єднання з базами даних MySQL: mysqlnd і libmysql. Починаючи з PHP 5.4, mysqlnd стала бібліотекою за замовчуванням. Однак, була можливість компілювати MySQLi через розширення.

Починаючи з PHP 8.2, компіляцію розширення MySQLi з libmysql більше не буде підтримуватися. Спроба зробити це призведе до помилки конфігурації:

./configure --with-mysqli=FOO

З’єднання mysqli з зовнішньою бібліотекою більше не підтримується

Це, ймовірно, не спричинить значних помилок для розробників. Проте, дві найбільші особливості, які підтримуються libmysql, але не доступні в mysqlnd, це підтримка автоматичного перепідключення та автентифікації через LDAP і SASL.

Тримайте вашу версію PHP WordPress актуальною

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

Зображення фону реклами

Ідеальне середовище розробки

Ми забезпечуємо швидкість, безпеку та постійну роботу вашого вебсайту, щоб відвідувачі довіряли вам. Плани починаються від $1.99/міс.

Вибрати план