dedlfix: Verhalten von SimpleXML unklar

Beitrag lesen

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";