该项目基于 PHP 原生的 DOMDocument 构建,提供对现代 DOM API 的访问,如同你在浏览器中处理客户端代码时所期望的那样。
在服务端代码中执行 DOM 操作,可以增强动态页面的构建方式。利用标准化的面向对象接口,页面可以预先处理,从而惠及浏览器、Web 服务器和内容分发网络。
重要提示: 此处示例仅用于说明目的,但使用 DOM 直接将数据设置到元素的值中,会将逻辑与视图紧密耦合,这被视为不良实践。请参阅 DomTemplate 库,以获取将数据绑定到 DOM 的更稳健的解决方案。
考虑一个包含表单的页面,其中有一个输入元素用于输入你的名字。当表单提交时,页面应通过你的名字向你问好。
这是一个简单的示例,展示了如何将源 HTML 文件视为模板。这可以轻松应用于更高级的模板页面以提供动态内容,而无需使用非标准技术,例如用 {{花括号}} 作为占位符,或在 PHP 中通过 echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' 这种容易出错的 HTML 拼接方式。
name.html)<!doctype html>
<h1>
你好,<span class="name-output">你</span> !
</h1>
<form>
<input name="name" placeholder="请输入你的名字" required />
<button>提交</button>
</form>
index.php)<?php
use Gt\Dom\HTMLDocument;
use Gt\Dom\HTMLElement\HTMLSpanElement;
require "vendor/autoload.php";
$html = file_get_contents("name.html");
$document = new HTMLDocument($html);
if(isset($_GET["name"])) {
$span = $document->querySelector(".name-output");
$span->innerText = $_GET["name"];
}
echo $document;
Element 类型代表所有 HTMLElement 规范,例如 HTMLAnchorElement(<a>)、HTMLButtonElement(<button>)、HTMLInputElement(<input>)、HTMLTableSectionElement(<thead>、<tbody>、<tfoot>)等。特定类型可通过 Element::getElementType() 检测,该方法返回 ElementType 枚举值之一。DOMException 扩展,用于捕获不同类型的异常,例如 EnumeratedValueException、HierarchyRequestError、IndexSizeException 等。FileList、StyleSheet、VideoTrackList、WindowProxy 等类。Element::querySelector() 和 Element::querySelectorAll() 使用 CSS 选择器引用元素ClassList 添加/移除/切换元素的类Element::previousElementSibling、Element::nextElementSibling、Element::children、Element::lastElementChild 和 firstElementChild 等遍历仅包含 Element 的节点ChildNode::remove()、、、 插入和移除子节点HTMLDocument 上的标准属性:
本仓库旨在尽可能准确地遵循 https://dom.spec.whatwg.org/ 上的 DOM 规范——自 v4.0.0 起,所有功能均已实现,但存在以下微小且不可避免的与标准的偏差:
tagName 属性为大写。HTMLElement 类型,必须调用 Element::getElementType()——例如,没有可用的 Element 子类用于 instanceof 操作。HTMLInputElement::files 返回一个 FileList,用于枚举用户通过浏览器界面选择的文件。此类功能无法在服务端实现,但为了与规范保持一致已进行了存根处理。在此库中尝试使用客户端功能会抛出 ClientSideOnlyFunctionalityException。本仓库旨在尽可能准确地遵循 DOM 规范。该仓库的扩展可在 https://php.gt/domtemplate 获取,它通过自定义元素和模板属性添加了页面模板和数据绑定功能,引入了类似 WebComponents 的服务端功能。
自 PHP 8.4 发布以来,PHP 原生提供了一种新的原生 HTMLDocument 类。由于具有原生绑定,所有操作都更快。已经开始着手使 PHPGT 的 Dom 实现利用新的原生代码。幸运的是,DOM 是一个非常定义良好的标准,因此无论发生什么,你的代码都只需要最少或无需更改。
请自行查看 php84-benchmark 分支上的基准测试:大多数操作记录显示,切换到原生实现后速度提升了 90% 或更高!
当在原生类的实现方面取得更多进展时,将在 readme 中提供更多信息。