Guten Abend zusammen!
Ich habe noch nicht sonderlich viel Erfahrung mit OOP, sowohl im Zusammenhang mit PHP als auch allgemein. Allerdings bin ich bisher per „learning by doing“ ganz gut zurecht gekommen. Bisher …
Ich versuche, eine Klasse zu schreiben, die sich ähnlich wie die SimpleXML Klasse verhält (ähnlich, nicht gleich, darum bastle ich selbst). Dazu habe ich erstmal versucht, mir die SimpleXML Objekte möglichst genau anzuschauen, um zu verstehen, wie darin welche Daten gespeichert sind. Mit Hilfe von var_dump() soweit auch so gut. Jetzt bin ich aber auf ein Verhalten von SimpleXML gestoßen, das ich absolut nicht nachvollziehen kann. Darum bin ich mal wieder bei euch gelandet …
Ein Beispiel:
<root>
<elementA>
<elementB>Foo</elementB>
<elementB>Bar</elementB>
</elementA>
</root>
Nach
$xml = simplexml_load_file(getcwd()."/test.xml");
var_info($xml); // var_info() ist im Prinzip var_dump, gibt aber noch <pre> mit aus
ist das Ergebnis noch wie erwartet.
Mir unklar wird es erst, wenn ich jetzt noch Text direkt in elementA einfüge:
<root>
<elementA>ABC
<elementB>Foo</elementB>
<elementB>Bar</elementB>
</elementA>
</root>
Denn dann ergibt der Dump folgendes:
object(SimpleXMLElement)#1 (1) {
["elementA"]=>
string(11) "ABC
"
}
Um die Frage ganz direkt auf den Punkt zu bringen: Wo sind die beiden elementB geblieben? Noch mysteriöser ist für mich, dass echo $xml->elementA->elementB;
immernoch „Foo“ ergibt, obwohl laut dem Dump elementB in dem Objekt doch garnicht existiert.
Oder, um meine Frage etwas anders zu formulieren: Wie kann es sein, dass echo $xml->elementA;
„ABC“ ergibt – sich elementA also wie eine String-Variable innerhalb des Objekts $xml
verhält – obwohl es zugleich doch offensichtlich selbst ein SimpleXML Objekt ist, da echo $xml->elementA->elementB;
den Zugriff auf das erste elementB erlaubt?
So, ich hoffe, meinen Gedankengang (und seine Grenzen ;-)) einigermaßen klar dargestellt zu haben – und dass ihr wie gewohnt wunderprächtige Tipps und Hinweise für mich habt. Bin wie immer gespannt …
Viele Grüße,
Claudius