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

Оглавление
- Внесение изменений в 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