Start · Sprachen · PHP · Referenz · xml_set_object

xml_set_object

Funktion

Bindet einen XML-Parser an ein Objekt, sodass Handler-Callbacks als Methoden dieses Objekts aufgerufen werden können.

seit PHP 4.0.0 Kategorie: xml

Signatur

xml_set_object(XMLParser $parser, object $object): bool

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

Typ
bool
Beschreibung
Gibt 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);
Öffnendes Element: <BUCH> Öffnendes Element: <TITEL> Textinhalt: PHP Handbuch Schließendes Element: </TITEL> Öffnendes Element: <AUTOR> Textinhalt: Max Mustermann Schließendes Element: </AUTOR> Schließendes Element: </BUCH>

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>');
Start: ROOT Start: KIND Ende: KIND Ende: 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.