• Время чтения: 15 минут

Теги: #Веб разработка

PHP 8.2: Что нового?

PHP 8.2 – это важный шаг на пути к модернизации языка PHP. Помимо добавления впечатляющих новых функций и улучшений, PHP 8.2 оптимизирует язык, отказываясь от поддержки динамических свойств, предупреждая при обнаружении некоторые неоптимальные значения конфигурации INI и исправляя некоторые устаревшие методы PHP, которые влияют на то, как PHP сортирует массивы и определенные типы операций преобразования/кодирования строк.

Улучшение системы типов

В PHP 8.2 устранены некоторые недостатки и ограничения системы типов, что предоставляет приложениям на PHP более высокий уровень безопасности типов. Это включает в себя добавление поддержки типа true и типов дизъюнктивных нормальных форм (DNF) и возможности использовать null и false как самостоятельные типы.

PHP 8.2 поддерживает типы дизъюнктивных нормальных форм (DNF). Это позволяет теперь комбинировать типы объединения (PHP 8.0) и типы пересечения (PHP 8.1), что позволяет заявлять точные и выразительные типы параметров, возвращаемых значений и свойств.

function process((HTMLRequest & RequestInterface) | APIRequest $request) {
// ...
}

Объявление типа (HTMLRequest & RequestInterface) | APIRequest гарантирует, что значение $request является либо инстансом APIRequest, либо объектом класса, который реализует/расширяет/является инстансом и HTMLRequest и RequestInterface.

Поддержка true и false как самостоятельных типов позволяет заменять объявления типа bool в случае если булево значение всегда одно и то же.

function alwaysReturnsFalse(): false {}
function alwaysReturnsNull(): null {}
function alwaysReturnsTrue(): true {}

В более старых версиях PHP уже было возможно объявлять обнуляемые типы или типы объединения с помощью null. С момента релиза PHP 8.2 возможно объявлять null еще и как самостоятельный тип.

Классы, доступные только для чтения

PHP 8.1 добавило поддержку свойств readonly. Свойство readonly может быть установлено только один раз, и PHP активно предотвращает изменение значения даже в рамках класса.

PHP 8.2 выводит свойства readonly на новый уровень с классами readonly. Когда класс объявляется как readonly, все его свойства автоматически объявляются как readonly. Кроме того, это предотвращает добавление динамических свойств в классы readonly и гарантирует, что все свойства типизированы.

readonly class User {
    public string $username;
    public string $uid;
}

Все свойства класса readonly User автоматически объявляются как readonly.

PHP 8.1

class User {
    public readonly int $uid;
    public readonly string $username;
}

PHP 8.2

readonly class User {
    public int $uid;
    public string $username;
}

Новое расширение random

На протяжении всей истории своего существования PHP поддерживал различные генераторы случайных чисел (RNG) с разной степенью производительности и вариантами использования, и подходил для безопасных приложений. PHP 8.2 делает еще один шаг вперед, проводя рефракторинг всего функционала, связанного с RNG, и вводя новое расширение под названием random.

Расширение random обеспечивает ту же функциональность без нарушения работы каких-либо API. Таким образом, существующие функции rand, mt_rand, random_bytes, и random_int продолжают работать без изменений. Это расширение также предоставляет объектно-ориентированный API для генерации случайных чисел с подключаемой архитектурой, так что теперь легче имитировать и создавать новые генераторы случайных чисел, делая приложения на PHP безопасными и простыми в тестировании.

Константы в трейтах

С PHP 8.2 теперь возможно использовать константы в трейтах. Этим трейтам невозможно получить доступ напрямую, но эти константы становятся константами класса когда класс использует этот трейт.

trait FooBar {
    const FOO = 'foo';
    private const BAR = 'bar';
    final const BAZ = 'baz';
    final protected const QUX = 'qux';
}

class Test {
    use FooBar;
}

echo Test::BAZ; // 'bar'

Это не было возможно в PHP 8.1 и более старых версиях. К константам трейтов невозможно получить доступ напрямую (например, FooBar: :F00 не допускается). Константы трейтов также не должны конфликтовать с другими трейтами или непостредственным классом, который их использует.

Возможность помечать конфиденциальную информацию

PHP 8.2 добавляет новый встроенный атрибут для параметров, который называется #[\SensitiveParameter]. При использовании этого атрибута параметры не будут перечислены в трассировках стека и сообщениях об ощибках.

Функции, которые принимают пароли, закрытые ключи и другую конфиденциальную информацию, могут объявлять параметры атрибутом #[\SensitiveParameter]. Если вызовы функции внутри нее вызывают ошибку PHP или исключение, фактическое значение, переданное этому параметру, будет заменено объектом.

Встроенные в PHP функции, такие как password_hash и password_verify уже объявлены атрибутом #[\SensitiveParameter].

 function passwordHash(string $password)  {
 function passwordHash(#[\SensitiveParameter] string $password)  {
       debug_print_backtrace();
 }

 passwordHash('hunter2');

При наличии атрибута #[\SensitiveParameter] все трассировки стека активно редактируют фактическое значение, переданное параметру:

array(1) {
[0]=> array(4) {
  ["file"]=> string(38) "..."
  ["line"]=> int(9)
  ["function"]=> string(3) "foo"
  ["args"]=> array(1) {
     [0]=> string(38) "hunter2"
     [0]=> object(SensitiveParameterValue)#1 (0) {}
  }
}
}

Новые функции и классы

В дополнение к полезным нововведениям, PHP 8.2 также привносит набор новых функций и классов:

Парсинг значений количества в INI: ini_parse_quantity

Функция ini_parse_quantity парсирует любой размер данных, распознаваемый значениями PHP INI (например, 56K, 256M, или 1G) и возврашает размер данных в байтах.

 ini_parse_quantity('256M'); // 268435456

Поддерживать активное соединение по Curl: curl_upkeep

Функция curl_upkeep в расширении Curl в PHP 8.2 запускает базовую библиотеку Curl для выполнения необходимых задач, чтобы поддерживать соединение по Curl. Самый распространенный случа использования этой функции – поддержка постоянного подключения по HTTP (Keep-Alive), периодически вызывая функцию curl_upkeep.

Получение длины ключа шифрования: openssl_cipher_key_length

В OpenSSL PHP 8.2 появилась новая функция openssl_cipher_key_length, которая возвращает требуемую длину ключа (в байтах) для любого шифра, поддерживаемого в OpenSSL.

Эта функция устраняет необходимость хардкода требуемой длины ключа для операций шифрований в OpenSSL.

openssl_cipher_key_length("CHACHA20-POLY1305"); // 32
openssl_cipher_key_length("AES-128-GCM"); // 16
openssl_cipher_key_length("AES-256-GCM"); // 32

Сброс записанного пикового использования памяти: memory_reset_peak_usage

В PHP 8.2 добавлена новая функция memory_reset_peak_usage, которая сбрасывает пиковое использование памятие, возвращаемое функцией memory_get_peak_usage.

Это может быть полезно в приложениях, которые вызывают или повторяют действие несколько раз, и которым нужно записывать пиковое использование памяти при каждом вызове. Без возможности сброса использования памяти с помощью новой функции memory_reset_peak_usage функция memory_get_peak_usage возвращает абсолютный пик использования памяти на протяжении всей работы приложения.

Устаревшие элементы в PHP 8.2

PHP 8.2 также содержит немало устаревших элементов. Когда синтаксис, функция или какой-либо другой элемент является устаревшим, PHP выдает предупреждение об устаревших функциях, которое не должно нарушать правильно настроеные приложения на PHP, но записывается в журнале ошибок.

Обратите внимание, что, начиная с PHP 8.0, конфигурация отчетов об ошибках PHP по умолчанию установлена как E_ALL.

Устаревшие динамические свойства

Одним из наиболее заметных устаревших элементов в PHP 8.2 являются динамически объявленные свойства класса. От них можно отказаться, но рекомендуется объявить свойства класса в объявлении класса, желательно также с объявлением типа.

class User {
    public int $uid;
}

$user = new User();
$user->name = 'Foo';

Deprecated: Creation of dynamic property User::$name is deprecated in ... on

Вероятно, это изменение повлияет на многие устаревшие приложения на PHP, поскольку устаревшие приложения, как правило, не объявляют свойства класса, когда они расширяются или получают развитие с годами изменений.

Рекомендуемый подход – объявить свойства в классе:

class User {
   public int $uid;
   public string $name; 
}

$user = new User();
$user->name = 'Foo';

Существуют также возможность отказаться от этого устаревшего элемента и исключения к нему:

  • stdClass и его подклассы
  • Классы с магическими методами __get и __set
  • Классы с новым атрибутом #[AllowDynamicProperties]

Устаревшие функции utf8_encode и utf8_decode

В PHP 8.2 функции utf8_encode и utf8_decode окончательно объявлены устаревшими. К сожалению, они были названы без упоминания того, что они кодируют/декодируют только из Latin 1 (ISO-8859-1).

Большинство приложений на PHP, которые используют эти функции, как правило, не знают об этом недостатке. Рекомендуемые замены – улучшенная функциональность, предоставляемая расширениями mbstring, iconv и intl.

Устаревшая интерполяция строк ${var}

PHP всегда поддерживал интерполяцию строковых переменных с шаблоном «foo {$bar}», а также с альтернативным синтаксисом, в котором знак доллара размещается вне фигурных скобок (например, «foo ${bar}»).

В PHP 8.2 альтернативный синтаксис размещения знака доллара вне фигурных скобок является устаревшим.

Устаревший в PHP 8.2

Синтаксис, рекомендованный для PHP8.2

Hello ${name};

Hello {$name}

echo "Hello ${$var}";

echo "Hello {$$var}";

Кроме того, в PHP 8.2 также являются устаревшими некоторые частично поддерживаемые вызываемые шаблоны и управление расширением Mbstring кодировок Base64, Uuencode, QPrint и HTML-сущностей.

Установка/обновление до PHP 8.2

PHP 8.2 теперь доступен для скачивания/установки со всех привычных источников:

  • Windows: Скомпилированные бинарные файлы доступны на windows.php.net.
  • Ubuntu/Debian: PHP 8.2 доступен на PPA ondrej/php. Подробное руководство по установке/обновлению доступно на PHP.Watch.
  • Fedora/RHEL/CentOS/Alma/Rocky: Доступен как набор программного обеспечения php82 из репозитория Remi.
  • Mac OS: PHP 8.2 можно установить через Homebrew с помощью репозитория shivammathur/homebrew-php.
  • Docker: Официальные образы PHP 8.2 теперь доступны на Docker Hub с тегами 8.2*.

Нововведения

  • Классы, доступные только для чтения (readonly)
  • Тип true
  • Null и false теперь самостоятельные типы
  • Типы DNF
  • Возможность помечать конфиденциальную информацию
  • Новое расширение Random
  • MySQLi: Новая функция mysqli_execute_query и новый метод mysqli::execute_query
  • Поддержка модификатора (/n) в функциях preg_*
  • Новый параметр INI error_log_mode для установки разрешений для файла журнала ошибок
  • OpenSSL: Новая функция openssl_cipher_key_length
  • Константы поддерживаются в трейтах
  • Новая функция curl_upkeep
  • Новая функция ini_parse_quantity function
  • Новая функция memory_reset_peak_usage
  • Curl: поддержка CURLINFO_EFFECTIVE_METHOD в функции curl_getinfo
  • Добавлена функция imap_is_open
  • Атрибут AllowDynamicProperties

Изменения синтаксиса/функциональности

  • Независимое от локали преобразование регистра
  • Предупреждения при парсинге INI
  • Изменения порядка сортировки ksort(..., SORT_REGULAR)
  • Функция str_split возвращает пустые массивы для пустых строк

Устаревший функционал

  • Устаревшие динамические свойства
  • Устаревшие функции utf8_encode и utf8_decode
  • Mbstring: устаревшие кодировки Base64, Uuencode, QPrint и HTML-сущностей.
  • Устаревшие частично поддерживаемые вызываемые шаблоны
  • Устаревшая интерполяция строк ${var}

Убранные функции

  • MySQLi больше не может быть скомпилирована с помощью libmysqli
Редакция WRP
Редакция WRP

В PHP 8.2 улучшена система типов, классы, доступные только для чтения (readonly), возможность помечать конфиденциальную информацию, новое расширение random, и множесто новых функций, а также несколько изменений, направленных на оптимизацию и модернизацию языка PHP.

Онлайн заказ
Комментарии:
Нет комментариев
Оставить комментарий

Ваш адрес email не будет опубликован.

Дайте оценку
Email info@wrp.ru
Телефон +7 (495) 230-20-53
Адрес

г. Москва, Хлебозаводский проезд, 7с9

Время работы

Пн-Пт: 10.00 - 19.00
Сб - Вс: выходной