Релиз PHP 8.4 состоялся 21 ноября 2024 года. Он будет включать property hooks (хуки свойств), поддержку HTML 5, а также возможность вызывать методы при создании объекта без дополнительных скобок! Давайте посмотрим подробнее:
Property hooks
Одно из самых больших изменений в современной истории PHP: возможность определять хуки свойств, устраняя необходимость в дублировании кода.
class BookViewModel
{
public function __construct(
private array $authors,
) {}
public string $credits {
get {
return implode(', ', array_map(
fn (Author $author) => $author->name,
$this->authors,
));
}
}
public Author $mainAuthor {
set (Author $mainAuthor) {
$this->authors[] = $mainAuthor;
$this->mainAuthor = $mainAuthor;
}
get => $this->mainAuthor;
}
}
Цель property hooks — убрать множество геттеров и сеттеров, позволяя каждому свойству определять свои собственные хуки get и set. Хуки являются опциональными, и не обязательно добавлять оба для конкретного свойства. Например, свойство только с хуком get является виртуальным свойством.
interface HasAuthors
{
public string $credits { get; }
public Author $mainAuthor { get; set; }
}
new без скобок
Появилась фича, которая облегчит нам жизнь: больше не нужно оборачивать вызовы new в скобки, чтобы иметь возможность удобно сразу вызвать метод. Так что вместо этого:
$name = (new ReflectionClass($objectOrClass))->getShortName();
Теперь можно делать так:
$name = new ReflectionClass($objectOrClass)->getShortName();
Это работает не только для методов. Вы также можете обратится к свойству, константе — что угодно. Спасибо Валентину Удальцову!
Асимметричная видимость
Еще одна революционная функция PHP 8.4 — это асимметричная видимость. Асимметричная видимость позволяет свойствам класса определять свою видимость (public, protected или private) на основе контекста чтения или записи. Наиболее распространенный пример асимметричной видимости — это публичные свойства, которые можно изменять только внутри класса. Такое свойство выглядит так:
class BookViewModel
{
public private(set) Author $author;
}
Поскольку "публичные свойства, которые можно изменять только в приватном контексте" являются наиболее распространенным случаем использования асимметричной видимости, также доступен сокращенный вариант:
class BookViewModel
{
private(set) Author $author; // то же самое, что и public private(set)
}
array_find
В PHP 8.4 добавлена довольно простая новая функция, одна из тех функций, о которых вы должны задаться вопросом "подождите, разве этого еще не было?" Я думаю, большинство разработчиков привыкли к сторонним классам коллекций, хотя я считаю, что иметь array_find() нативно в PHP - это довольно удобно.
$firstMatch = array_find(
$posts,
function (Post $post) {
return strlen($post->title) > 5;
}
);
Неявные nullable типы устарели
У PHP было странное поведение, когда типизированная переменная со значением по умолчанию null автоматически становилась nullable:
function save(Book $book = null) {}
// Устарело: Неявная маркировка параметра $book как nullable устарела,
// должен использоваться явный nullable тип
function save(?Book $book = null) {}
Новая поддержка HTML5
PHP 8.4 добавляет класс \Dom\HTMLDocument, который способен правильно парсить код HTML5. Старый класс \DOMDocument по-прежнему доступен для обратной совместимости.
$doc = \Dom\HTMLDocument::createFromString($contents);
Изменения JIT
PHP 8.4 меняет способ включения JIT. Ранее нужно было установить opcache.jit_buffer_size в 0, чтобы отключить JIT, но теперь его можно отключить так:
opcache.jit=disable
opcache.jit_buffer_size=64m
Ленивые объекты
Наконец, PHP 8.4 добавляет нативную поддержку ленивых объектов, общий паттерн, используемый фреймворками для создания прокси-объектов.
$initializer = static function (MyClass $proxy): MyClass {
return new MyClass(123);
};
$reflector = new ReflectionClass(MyClass::class);
$object = $reflector->newLazyProxy($initializer);
Атрибут #[Deprecated]
PHP теперь имеет встроенный атрибут, который можно использовать для пометки методов, функций и констант как устаревших:
#[Deprecated("use formFields() instead", since: "moonshine/moonshine:2.0")]
function hideOnIndex() {
// …
}
Небольшие добавления
- Новая функция request_parse_body() для парсинга запросов RFC1867 (multipart) в не-POST HTTP запросах
- Новые статические конструкторы для создания объектов DateTime и DateTimeImmutable из timestamp
- Две новые функции, связанные с микросекундами для объектов DateTime и DateTimeImmutable
- Поддержка специфичных для драйвера подклассов PDO
- Новая поддержка специфичных для драйвера SQL парсеров
Обратно несовместимые изменения
- Константа E_STRICT устарела, и соответствующий уровень ошибок удален
- Некоторые свойства элементов DOM устарели
- Класс GMP теперь final и не может быть расширен
- Дополнительные ошибки значений в MBString
- Дополнительные ошибки значений в PCNTL
Оригинал статьи - https://stitcher.io/blog/new-in-php-84