Дата публикации: 21.11.2024 в 17:27

Что нового в PHP 8.4

Danil ShutskyDanil Shutsky
0 комментария

Релиз 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

ОбщайсяРазвивайсяУчисьРаботай
ОбщайсяРазвивайсяУчисьРаботай
ОбщайсяРазвивайсяУчисьРаботай
ОбщайсяРазвивайсяУчисьРаботай