• База знаний
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

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

Релиз PHP 8.3: детальный обзор

Оглавление

Релиз 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
navigate
go
exit
Спасибо, что выбираете FREEhost.UA