Signatur
Beschreibung
Dom\ParentNode ist ein Interface aus der modernen Dom-Erweiterung (PHP 8.4+), das von Knoten implementiert wird, welche Kindelemente enthalten können – konkret von Dom\Document, Dom\Element und Dom\DocumentFragment. Es spiegelt das gleichnamige Web-API-Interface wider und ergänzt die klassenbasierte DOM-API um komfortablere Zugriffsmöglichkeiten.
Das Interface stellt lesende Eigenschaften wie children, firstElementChild, lastElementChild und childElementCount bereit, mit denen ausschließlich Element-Knoten (keine Text- oder Kommentarknoten) angesprochen werden. Zusätzlich bietet es die Methoden prepend(), append(), replaceChildren() sowie querySelector() und querySelectorAll(), die das Arbeiten mit dem DOM erheblich vereinfachen.
Im Unterschied zur älteren DOMNode-Hierarchie ist Dom\ParentNode Teil der neuen, strikteren und HTML5-konformen DOM-API, die in PHP 8.4 eingeführt wurde. Wer mit dieser API arbeitet, profitiert von typsicheren Rückgabewerten und einer klareren Trennung zwischen Element- und Nicht-Element-Kindknoten.
Typischerweise wird dieses Interface nicht direkt implementiert, sondern über die konkreten Klassen genutzt. Es kann jedoch für Typ-Hinweise in eigenen Funktionen verwendet werden, um ausdrücklich sicherzustellen, dass ein übergebener Knoten Kindelemente besitzen kann.
Beispiele
Kindelemente zählen und darauf zugreifen
<?php
$dom = Dom\HTMLDocument::createFromString('<ul><li>Eins</li><li>Zwei</li><li>Drei</li></ul>');
$ul = $dom->querySelector('ul');
// childElementCount: Anzahl der direkten Kinder als Elemente
echo $ul->childElementCount . PHP_EOL; // 3
// firstElementChild / lastElementChild
echo $ul->firstElementChild->textContent . PHP_EOL; // Eins
echo $ul->lastElementChild->textContent . PHP_EOL; // Drei
// Alle Kinder als HTMLCollection
foreach ($ul->children as $child) {
echo $child->textContent . PHP_EOL;
}
Elemente einfügen mit append() und prepend()
<?php
$dom = Dom\HTMLDocument::createFromString('<div id="box"><p>Mitte</p></div>');
$box = $dom->getElementById('box');
// Neues Element am Anfang einfügen
$first = $dom->createElement('p');
$first->textContent = 'Anfang';
$box->prepend($first);
// Neues Element am Ende einfügen
$last = $dom->createElement('p');
$last->textContent = 'Ende';
$box->append($last);
foreach ($box->children as $child) {
echo $child->textContent . PHP_EOL;
}
Typsicherer Funktionsparameter mit Dom\ParentNode
<?php
use Dom\ParentNode;
function countElements(ParentNode $node): int {
return $node->childElementCount;
}
$dom = Dom\HTMLDocument::createFromString('<section><h1>Titel</h1><p>Text</p></section>');
$section = $dom->querySelector('section');
echo countElements($section) . PHP_EOL; // 2
// Wichtig · Fallstricke
Nur PHP 8.4+: Dom\ParentNode gehört zur neuen Dom-Erweiterung, die in PHP 8.4 eingeführt wurde. Sie ist nicht kompatibel mit der älteren DOM-Erweiterung (DOMDocument, DOMElement usw.). Beide APIs können im selben Projekt existieren, sind aber getrennt zu verwenden.
Die Eigenschaft children gibt eine Dom\HTMLCollection zurück, die ausschließlich Element-Knoten enthält. Text-, Kommentar- und andere Knoten werden dabei ignoriert – im Gegensatz zu childNodes, das alle Knotentypen liefert.
querySelector() und querySelectorAll() akzeptieren CSS-Selektoren. Bei ungültigen Selektoren wird eine Dom\Exception geworfen, daher empfiehlt sich deren Einsatz in einem try/catch-Block.