Статья также доступна на украинском (перейти к просмотру).
Оглавление
- Внесение изменений в 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(); // Теперь можно переинициализировать власть только для чтения во время клонирования. } }
Атрибут 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 не ошибки, а на самом деле они полезны для развития речи. Вот 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 уже доступна на нашем виртуальном хостинге. Заказать хостинг c PHP 8.3 вы можете уже сейчас!
Подписывайтесь на наш телеграм-канал https://t.me/freehostua, тобы быть в курсе новых полезных материалов.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем-то ошиблись, или что-то пропустили?
Напишите об этом в комментариях на сайте и в телеграм-канале. Мы с удовольствием ответим и обсудим Ваши замечания и предложения.
Дата: 29.11.2023 Автор: Сергей Носенко
|
|
Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus