Signatur
Beschreibung
xml_set_object ermöglicht es, einen XML-Parser mit einem Objekt zu verknüpfen. Nach dem Aufruf dieser Funktion können alle Handler-Callbacks (z. B. für Element-Start, Element-Ende, Zeichendaten) als Methoden des angegebenen Objekts registriert werden – anstatt als einfache globale Funktionen.
Dies ist besonders nützlich, wenn XML-Parsing in objektorientiertem PHP-Code stattfinden soll. Man übergibt zunächst xml_set_object($parser, $this), und anschließend können bei Funktionen wie xml_set_element_handler Methodennamen als einfache Zeichenketten angegeben werden, die dann automatisch auf dem verknüpften Objekt aufgerufen werden.
Typischerweise wird xml_set_object in einer Klassen-Methode wie __construct oder einer Initialisierungsmethode aufgerufen, um den Parser für den gesamten Lebenszyklus des Objekts zu konfigurieren. Alle nachfolgenden Handler-Registrierungen beziehen sich dann auf Methoden dieser Klasse.
Hinweis: Ab PHP 8.0.0 wird die Verwendung von Ressourcen als Parser-Parameter durch das Objekt XMLParser ersetzt. Die Funktion selbst gibt seit PHP 8.0.0 immer true zurück und ist in neuem Code durch die Verwendung direkter Callbacks (z. B. Closures oder [$this, 'methodName']) zunehmend ersetzbar.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $parser Pflicht | XMLParser | Eine gültige XMLParser-Instanz, die zuvor mit xml_parser_create erzeugt wurde. |
|
| $object Pflicht | object | Das Objekt, an das der Parser gebunden werden soll. Methoden dieses Objekts können anschließend als Handler-Callbacks registriert werden. |
Rückgabewert
true zurück. Seit PHP 8.0.0 wird immer true zurückgegeben; in früheren Versionen konnte false bei ungültigem Parser zurückgegeben werden.Beispiele
XML-Parser in einer Klasse verwenden
<?php
class MeinXmlParser {
private XMLParser $parser;
private array $elemente = [];
public function __construct() {
$this->parser = xml_parser_create('UTF-8');
// Parser an dieses Objekt binden
xml_set_object($this->parser, $this);
// Handler als Methodennamen registrieren
xml_set_element_handler($this->parser, 'elementStart', 'elementEnde');
xml_set_character_data_handler($this->parser, 'zeichenDaten');
}
public function elementStart(XMLParser $parser, string $name, array $attrs): void {
echo "Öffnendes Element: <{$name}>\n";
$this->elemente[] = $name;
}
public function elementEnde(XMLParser $parser, string $name): void {
echo "Schließendes Element: </{$name}>\n";
}
public function zeichenDaten(XMLParser $parser, string $daten): void {
$trimmed = trim($daten);
if ($trimmed !== '') {
echo "Textinhalt: {$trimmed}\n";
}
}
public function parse(string $xml): bool {
return xml_parse($this->parser, $xml, true);
}
public function __destruct() {
xml_parser_free($this->parser);
}
}
$xmlDaten = '<buch><titel>PHP Handbuch</titel><autor>Max Mustermann</autor></buch>';
$parser = new MeinXmlParser();
$parser->parse($xmlDaten);
Alternative: Closure statt xml_set_object (moderner Ansatz)
<?php
// Moderner Ansatz ohne xml_set_object – direkte Closures verwenden
class ModernerXmlParser {
private XMLParser $parser;
public function __construct() {
$this->parser = xml_parser_create('UTF-8');
// Direkte Closure mit $this – kein xml_set_object nötig
xml_set_element_handler(
$this->parser,
function(XMLParser $parser, string $name, array $attrs): void {
$this->elementStart($name, $attrs);
},
function(XMLParser $parser, string $name): void {
$this->elementEnde($name);
}
);
}
private function elementStart(string $name, array $attrs): void {
echo "Start: {$name}\n";
}
private function elementEnde(string $name): void {
echo "Ende: {$name}\n";
}
public function parse(string $xml): void {
xml_parse($this->parser, $xml, true);
xml_parser_free($this->parser);
}
}
$p = new ModernerXmlParser();
$p->parse('<root><kind/></root>');
// Wichtig · Fallstricke
Deprecation-Hinweis: Ab PHP 8.4.0 ist xml_set_object als deprecated markiert und sollte nicht mehr in neuem Code verwendet werden. Stattdessen sollten direkte Callbacks (Closures oder [$this, 'methodName']) bei den Handler-Registrierungsfunktionen übergeben werden.
Bei Verwendung von xml_set_object müssen die Handler-Namen als einfache Zeichenketten übergeben werden (z. B. 'elementStart'), nicht als Array-Callbacks. PHP löst diese Zeichenketten dann als Methoden des verknüpften Objekts auf.
Beachte, dass der XML-Parser Elementnamen standardmäßig in Großbuchstaben umwandelt, sofern die Einstellung mit xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false) nicht deaktiviert wird.