ID: 43542 Comment by: hubert dot roksor at gmail dot com Reported By: 007not at gmail dot com Status: Open Bug Type: SimpleXML related Operating System: win xp sp2 PHP Version: 5.2.5 New Comment:
Regarding your first test, I wouldn't consider that a bug. var_dump() is a debugging tool, it may expose some of the behind-the-scene magic. Actually, that "comment" property might have been intentionally created as a way to indicate whether the node has a comment. That would explain isset()'s behaviour in your third test, but in this case I would recommand replacing that magical property with a method such as $node->hasComment(). I guess Rob Richards will be able to shed some light here. As for your second test, I'm afraid it is incorrect: both $xml->node and $xml->otherNode should return 1 element and I don't see why having a comment as a child would change that. Previous Comments: ------------------------------------------------------------------------ [2007-12-09 11:02:10] 007not at gmail dot com Description: ------------ also see http://bugs.php.net/43392 >[EMAIL PROTECTED] comment: >This is just normal and expected behaviour. ><foo><!-- comment --></foo> is not same as <foo></foo>. >(try var_dump($xml); to see what happens) i made some new test for you, and try to var_dump() this var_dump(array(/*'comment' => 'value'*/)); <foo><!-- comment --></foo> === <foo></foo> && array(/*'comment' => 'value'*/) === array('comment' => 'value') is it still be same ? ;) Reproduce code: --------------- $string = <<<XML <?xml version='1.0'?> <document> <node><!-- comment --></node> <otherNode></otherNode> <comment>value</comment> </document> XML; $xml = simplexml_load_string($string); //note: xdebug used //first test var_dump($xml->node); var_dump($xml->otherNode); /* Expected result: ---------------- null object(SimpleXMLElement)[2] public 'comment' => string 'value' (length=5) Actual result: -------------- object(SimpleXMLElement)[2] public 'comment' => object(SimpleXMLElement)[4] object(SimpleXMLElement)[2] public 'comment' => string 'value' (length=5) */ //second test $i = 0; foreach ($xml->node as $node) { $i++; } echo $i . "\n"; $i = 0; foreach ($xml->otherNode as $node) { $i++; } echo $i . "\n"; /* Expected result: ---------------- 0 1 Actual result: -------------- 1 1 */ //third test var_dump($xml->node->comment); var_dump($xml->otherNode->comment); //check magic echo "node:\n"; if (is_object($xml->node->comment)) { echo "is_object === TRUE \n"; } if (isset($xml->node->comment)) { echo "isset === TRUE \n"; } //but if (strlen($xml->node->comment) > 0) { echo "strlen > 0\n"; } if (strlen($xml->node->comment) == 0) { echo "strlen == 0\n"; } echo "otherNode:\n"; if (is_object($xml->otherNode->comment)) { echo "is_object === TRUE \n"; } if (isset($xml->otherNode->comment)) { echo "isset === TRUE \n"; } /* Expected result: ---------------- node: is_object === TRUE isset === TRUE strlen == 0 otherNode: is_object === TRUE Actual result: -------------- node: is_object === TRUE strlen == 0 otherNode: is_object === TRUE */ Expected result: ---------------- see code Actual result: -------------- see code ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=43542&edit=1