Поддержка HTML 5 в PHP 8.4

Источник: «HTML 5 support in PHP 8.4»
Несмотря на то, что HTML 5 существует уже более 16 лет, PHP никогда не поддерживал его должным образом. В PHP есть \DOMDocument, который теоретически должен поддерживать HTML 4, но на самом деле он уже не совместим с HTML 4.

Итак, это классика PHP — верно 😅? Что ж, можно смеяться сколько угодно, но давайте уделим время новым функциям, которые — пусть и с опозданием — исправляют эти причуды: PHP 8.4 добавляет парсер, совместимый с HTML 5! В этой статье я расскажу об основных особенностях этого нового парсера, и вы также можете прочитать со мной весь RFC:

Обратная совместимость

Одним из основных требований к новому парсеру является его полная обратная совместимость. Именно поэтому разработчики решили создать совершенно новый класс — в новом пространстве имён — для размещения нового парсера HTML 5. Старый класс \DOMDocument оставлен (в основном) в покое. Единственное изменение в старой реализации заключается в том, что \DOMDocument теперь расширяет абстрактный класс \Dom\Document, который также является родителем для новой, совместимой с HTML 5 реализации: \Dom\HTMLDocument.

Если необходимо использовать новый парсер HTML 5 в PHP, то вам нужен именно он:

// Совместимость с HTML 5
$dom = \Dom\HTMLDocument::createFromString($html);

Старая версия по-прежнему доступна:

// Поддержка HTML 4
$oldDom = new \DOMDocument();
$oldDom->loadHTML($html);

Создание DOM

Одно из ключевых отличий, которое бросается в глаза, заключается в том, что новая реализация полагается на статические конструкторы вместо последующего вызова методов только что созданного объекта. Новый класс HTMLDocument имеет три именованных конструктора:

HTMLDocument::createEmpty();
HTMLDocument::createFromFile($path);
HTMLDocument::createFromString($html);

Вот их полные сигнатуры:

public static function createEmpty(string $encoding = "UTF-8"): HTMLDocument;
public static function createFromFile(string $path, int $options = 0, ?string $override_encoding = null): HTMLDocument;
public static function createFromString(string $source, int $options = 0, ?string $override_encoding = null): HTMLDocument;

Для переменной $options доступны следующие опции:

Переменная $override_encoding используется для переопределения неявных процедур определения кодировки, определяемых спецификацией HTML-парсера. Это может быть удобно, когда документ загружается вручную.

Объекты DOM

Ещё одно удачное конструктивное решение заключается в том, что итоговый HTMLDocument содержит список узлов DOM, которые по-прежнему представлены старыми объектами DOMNode. Фактически, все объекты-значения, связанные с DOM, остаются неизменными, независимо от того, какой парсер используется. Это означает, что можно переключиться со старого \DOMDocument на новый \Dom\HTMLDocument, и весь базовый код — теоретически — должен продолжать работать.

Этот RFC также добавляет псевдонимы для этих классов объектов-значений в пространство имён \Dom, подготавливая возможный путь обновления в случае, если старый код однажды потребуется перенести. Так, например, \DOMElement будет также доступен как \Dom\Element, \DOMAttribute как \Dom\Attribute и т.д. Обе версии могут использоваться как взаимозаменяемые.

Хоть и с небольшим опозданием, думаю, что это очень хорошее дополнение к PHP. У меня определённо есть несколько сценариев его использования! А какие у вас соображения?

Дополнительные материалы

Предыдущая Статья

CSS свойство display

Следующая Статья

array_find в PHP 8.4