echo $begrüßung;
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
>
>
> "
> }
Das Problem ist, dass elementA nun sowohl skalare Daten als auch Nodes enthält. Das kann man mit einer PHP-Variablen nicht so einfach abbilden. Als Ausweg könnte man ein Textnode-Objekt für das ABC zu verwenden. Dann könnte man statt des Strings ABC… ein Array oder Objekt simulieren (dazu später mehr), das sowohl Textnodes als auch XML-Nodes enthält. Stattdessen werden hier zur Stringdarstellung nur die reinen Textbestandteile außerhalb von XML-Elementen verwendet, also ABC, Zeilenumbrüche und Leerzeichen.
> Um die Frage ganz direkt auf den Punkt zu bringen: Wo sind die beiden elementB geblieben?
Ent-oder-weder. Text oder XML-Nodes. Beides gleichzeitig geht nicht. Jedenfalls nicht mit SimpleXML, das sich hier Textnode-Elemente spart.
Neben den allgemeinen OOP-Dingen ist unter PHP einige Magie zu beachten. Beschrieben ist diese im [PHP5-OOP-Kapitel](http://www.php.net/manual/en/language.oop5.php), speziell [Overloading](http://www.php.net/manual/en/language.oop5.overloading.php) und [Magic Methods](http://www.php.net/manual/en/language.oop5.magic.php). Außerdem spielt auch die [SPL](http://www.php.net/manual/en/book.spl.php) eine Rolle. Mit der man noch weitere Spielereien machen kann, die vom Standardverhalten abweichen.
In deinem Fall hat sich PHP oder SimpleXML entschieden, einen Stringkontext anzunehmen und für elementA \_\_toString() aufzurufen.
> Noch mysteriöser ist für mich, dass `echo $xml->elementA->elementB;`{:.language-php} immernoch „Foo“ ergibt, obwohl laut dem Dump elementB in dem Objekt doch garnicht existiert.
In dem Fall wird elementA nicht im Stringkontext befragt.
> Oder, um meine Frage etwas anders zu formulieren: Wie kann es sein, dass `echo $xml->elementA;`{:.language-php} „ABC“ ergibt – sich elementA also wie eine String-Variable innerhalb des Objekts `$xml`{:.language-php} verhält – obwohl es zugleich doch offensichtlich selbst ein SimpleXML Objekt ist, da `echo $xml->elementA->elementB;`{:.language-php} den Zugriff auf das erste elementB erlaubt?
Stringkontext oder nicht => \_\_toString() oder nicht.
echo "$verabschiedung $name";