W3docs

xml_set_object()

Die Funktion xml_set_object() legt das Objekt fest, auf das die Handler-Funktionen eines XML-Parsers angewendet werden sollen.

Die Funktion xml_set_object() ist eine in PHP integrierte Funktion, die das Objekt festlegt, auf das die Handler-Funktionen eines XML-Parsers angewendet werden sollen. Sie ist Teil der veralteten XML-Parser-Erweiterung. Wenn Sie sie aufrufen, behandelt der Parser die Namen, die Sie Funktionen wie xml_set_element_handler() übergeben, nicht mehr als globale Funktionen, sondern als Methoden des angegebenen Objekts.

Diese Seite erklärt, was die Funktion tut, ihre Signatur und Parameter, ein vollständiges ausführbares Beispiel, häufige Fallstricke und wie sie sich auf den Rest der XML-Parser-API bezieht.

Hinweis: xml_set_object() gehört zur veralteten XML-Parser-(Expat-)Erweiterung und ist seit PHP 8.4 veraltet — übergeben Sie stattdessen ein geeignetes Method-Callable (z.B. [$object, 'method']) direkt an die xml_set_*_handler()-Funktionen. Für neuen Code bevorzugen Sie SimpleXML oder DOMDocument, die das Dokument direkt als Objekte modellieren, anstatt Callback-Handler zu verwenden.

Warum es verwenden

Ohne xml_set_object() muss jeder registrierte Handler eine eigenständige Funktion sein (oder ein String-und-statische-Methode-Paar). Das macht es schwierig, den Zustand zwischen Handlern zu teilen — man greift am Ende auf Globals zurück.

Durch das Binden des Parsers an ein Objekt können Sie:

  • Den Parse-Zustand (einen Stack, einen Zähler, das aufzubauende Dokument) in Objekteigenschaften speichern.
  • Einfache Methodennamen als Handler registrieren und sie gegen dieses Objekt auflösen lassen.
  • Einen gesamten Parser als wiederverwendbare Klasse kapseln.

Dies ist die idiomatische Art, die prozedurale Expat-API in objektorientiertem Code zu kapseln.

Syntax

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

Parameter

ParameterBeschreibung
$parserDer zu konfigurierende XML-Parser. Erstellen Sie einen mit xml_parser_create().
$objectDas Objekt, dessen Methoden als Handler verwendet werden. Danach registrierte Handler-Namen werden als Methoden dieses Objekts aufgelöst.

Rückgabewert

Gibt true bei Erfolg und false bei einem Fehler zurück. (Seit PHP 8.0 ist $parser eine XMLParser-Instanz; in PHP 7 und früher war es eine Ressource.)

Reihenfolge ist wichtig: Rufen Sie xml_set_object() vor der Registrierung von Handlern wie xml_set_element_handler() oder xml_set_character_data_handler() auf. Handler-Namen, die nach dem Setzen des Objekts registriert werden, werden auf diesem Objekt nachgeschlagen.

Beispiel: Parser an ein Objekt binden

Angenommen, Sie haben einen XML-String, der mit der XML-Parser-Erweiterung geparst werden soll. Erstellen Sie einen Parser mit xml_parser_create(), binden Sie ihn mit xml_set_object() an ein Handler-Objekt und registrieren Sie dann die Element-Handler nach Methodenname:

class MyHandler {
    function startElement($parser, $name, $attribs) {
        echo "Start element: $name\n";
    }
    function endElement($parser, $name) {
        echo "End element: $name\n";
    }
}

$handler    = new MyHandler();
$xmlParser  = xml_parser_create();
xml_set_object($xmlParser, $handler);
xml_set_element_handler($xmlParser, "startElement", "endElement");

$xmlData = '<root><item>Test</item></root>';
xml_parse($xmlParser, $xmlData, true);
xml_parser_free($xmlParser);

Ausgabe:

Start element: ROOT
Start element: ITEM
End element: ITEM
End element: ROOT

Element-Namen werden standardmäßig in Großbuchstaben übergeben, da die Groß-/Kleinschreibungsanpassung aktiviert ist, sofern Sie sie nicht mit xml_parser_set_option() deaktivieren. Der erste Parameter jedes Handlers ist der Parser selbst, nicht das gebundene Objekt — innerhalb der Methode haben Sie bereits $this, daher wird dieses erste Argument selten verwendet.

Beispiel: Zustand im Objekt akkumulieren

Der eigentliche Vorteil ist der gemeinsame Zustand. Hier hält das Objekt eine laufende Tiefe, damit es den Baum schön formatiert ausgeben kann — etwas, das ohne xml_set_object() ein Global erfordern würde:

class TreePrinter {
    private int $depth = 0;

    function open($parser, $name) {
        echo str_repeat("  ", $this->depth) . "<$name>\n";
        $this->depth++;
    }
    function close($parser, $name) {
        $this->depth--;
        echo str_repeat("  ", $this->depth) . "</$name>\n";
    }
}

$parser = xml_parser_create();
xml_set_object($parser, new TreePrinter());
xml_set_element_handler($parser, "open", "close");
xml_parse($parser, "<a><b><c/></b></a>", true);
xml_parser_free($parser);

Ausgabe:

<A>
  <B>
    <C>
    </C>
  </B>
</A>

Häufige Fallstricke

  • Setzen Sie das Objekt zuerst. Das Registrieren eines Handlers vor xml_set_object() löst den Namen als globale Funktion auf, nicht als Methode.
  • Handler-Namen sind Strings. Übergeben Sie den Methodennamen ("open"), kein Callable-Array. Die Bindung ist es, die dem Parser mitteilt, den Namen auf dem Objekt nachzuschlagen.
  • Geben Sie den Parser frei. Rufen Sie xml_parser_free() auf, wenn Sie fertig sind (modernes PHP bereinigt auch automatisch).
  • Es ist veraltet. Neue Projekte sollten stattdessen SimpleXML oder DOMDocument verwenden.

Verwandte Funktionen

Fazit

xml_set_object() bindet einen XML-Parser an ein Objekt, sodass danach registrierte Handler-Namen als Methoden dieses Objekts aufgelöst werden. Der Vorteil liegt in der Kapselung: Der Parse-Zustand lebt in Objekteigenschaften statt in Globals, und ein gesamter Parser kann als Klasse verpackt werden. Denken Sie daran, sie vor der Registrierung von Handlern aufzurufen, und dass die Funktion Teil der veralteten Expat-Erweiterung ist — für neuen Code greifen Sie auf SimpleXML oder DOMDocument zurück.

Übungen

Übung
Was ist der Zweck der Funktion xml_set_object() in PHP?
Was ist der Zweck der Funktion xml_set_object() in PHP?
Was this page helpful?