Bug #68507 [NEW]: SimpleXML objects casted to boolean inconsistently

From: Date: Wed, 26 Nov 2014 18:28:35 +0000
Subject: Bug #68507 [NEW]: SimpleXML objects casted to boolean inconsistently
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-188805@lists.php.net to get a copy of this message
From: dmitri dot sologoubenko at gmail dot com Operating system: Ubuntu PHP version: 5.5.19 Package: SimpleXML related Bug Type: Bug Bug description:SimpleXML objects casted to boolean inconsistently Description: ------------ As per PHP documentation (online, see http://php.net/manual/en/control-structures.if.php): > As described in the section about expressions, expression is evaluated to > its Boolean value. If expression evaluates to TRUE, PHP will execute > statement, and if it evaluates to FALSE - it'll ignore it. More > information about what values evaluate to FALSE can be found in the > 'Converting to boolean' section. The "Converting to boolean" section of this explanation states: > Converting to boolean > When converting to boolean, the following values are considered FALSE: > ...omissis... > SimpleXML objects created from empty tags Children elements "b" and "d" ARE empty (no content), therefore I was expecting "false", and "a", "c", "e" ARE NOT empty, so I was expecting "true". As is comes out, that statement in PHP documentation is absolutely NOT true, and the behaviour doesn't even seem consistent: implicit or explicit casts to boolean don't behave the same way (see case of element "c"), and if the bare SimpleXML object is used as "if" conditional expression (both "if" and ternary operator), somehow that conditional expression evaluates differently from a cast to boolean. Test script: --------------- <?php $xmlString = '<'.'?xml version="1.0" encoding="UTF-8"?'.'>' . '<rootEl>' . '<a attrA="valA">xxx</a>' . '<b attrB="valB"/>' . '<c>oink</c>' . '<d/>'. '<e>' . '<f>zzz</f>' . '</e>' . '</rootEl>'; $xml = simplexml_load_string( $xmlString ); foreach ( $xml->children() as $child ) { echo "\$CHILD [" . $child->getName() . "]: " . $child->asXML(); echo "\n"; $insideIf1 = false; if ($child) { $insideIf1 = true; } $insideIf2 = false; if (true == $child) { $insideIf2 = true; } $insideIf3 = false; if ((boolean)$child) { $insideIf3 = true; } echo " - if(\$CHILD) return \"true\"; else return \"false\"; : " . (($insideIf1)?"true":"false")."\n"; echo " - if(true == \$CHILD) return \"true\"; else return \"false\"; : " . (($insideIf2)?"true":"false")."\n"; echo " - if((boolean)\$CHILD) return \"true\"; else return \"false\"; : " . (($insideIf3)?"true":"false")."\n"; echo " - ((\$CHILD)?\"true\":\"false\"): " . (($child)?"true":"false")."\n"; echo " - ((true == \$CHILD)?\"true\":\"false\"): " . ((true == $child)?"true":"false")."\n"; echo " - (((boolean)\$CHILD)?\"true\":\"false\"): " . (((boolean)$child)?"true":"false")."\n"; echo "\n"; } Expected result: ---------------- $CHILD [a]: <a attrA="valA">xxx</a> - if($CHILD) return "true"; else return "false"; : true - if(true == $CHILD) return "true"; else return "false"; : true - if((boolean)$CHILD) return "true"; else return "false"; : true - (($CHILD)?"true":"false"): true - ((true == $CHILD)?"true":"false"): true - (((boolean)$CHILD)?"true":"false"): true $CHILD [b]: <b attrB="valB"/> - if($CHILD) return "true"; else return "false"; : false - if(true == $CHILD) return "true"; else return "false"; : false - if((boolean)$CHILD) return "true"; else return "false"; : false - (($CHILD)?"true":"false"): false - ((true == $CHILD)?"true":"false"): false - (((boolean)$CHILD)?"true":"false"): false $CHILD [c]: <c>oink</c> - if($CHILD) return "true"; else return "false"; : true - if(true == $CHILD) return "true"; else return "false"; : true - if((boolean)$CHILD) return "true"; else return "false"; : true - (($CHILD)?"true":"false"): true - ((true == $CHILD)?"true":"false"): true - (((boolean)$CHILD)?"true":"false"): true $CHILD [d]: <d/> - if($CHILD) return "true"; else return "false"; : false - if(true == $CHILD) return "true"; else return "false"; : false - if((boolean)$CHILD) return "true"; else return "false"; : false - (($CHILD)?"true":"false"): false - ((true == $CHILD)?"true":"false"): false - (((boolean)$CHILD)?"true":"false"): false $CHILD [e]: <e><f>zzz</f></e> - if($CHILD) return "true"; else return "false"; : true - if(true == $CHILD) return "true"; else return "false"; : true - if((boolean)$CHILD) return "true"; else return "false"; : true - (($CHILD)?"true":"false"): true - ((true == $CHILD)?"true":"false"): true - (((boolean)$CHILD)?"true":"false"): true Actual result: -------------- $CHILD [a]: <a attrA="valA">xxx</a> - if($CHILD) return "true"; else return "false"; : true - if(true == $CHILD) return "true"; else return "false"; : true - if((boolean)$CHILD) return "true"; else return "false"; : true - (($CHILD)?"true":"false"): true - ((true == $CHILD)?"true":"false"): true - (((boolean)$CHILD)?"true":"false"): true $CHILD [b]: <b attrB="valB"/> - if($CHILD) return "true"; else return "false"; : true - if(true == $CHILD) return "true"; else return "false"; : false - if((boolean)$CHILD) return "true"; else return "false"; : true - (($CHILD)?"true":"false"): true - ((true == $CHILD)?"true":"false"): false - (((boolean)$CHILD)?"true":"false"): true $CHILD [c]: <c>oink</c> - if($CHILD) return "true"; else return "false"; : false - if(true == $CHILD) return "true"; else return "false"; : true - if((boolean)$CHILD) return "true"; else return "false"; : false - (($CHILD)?"true":"false"): false - ((true == $CHILD)?"true":"false"): true - (((boolean)$CHILD)?"true":"false"): false $CHILD [d]: <d/> - if($CHILD) return "true"; else return "false"; : false - if(true == $CHILD) return "true"; else return "false"; : false - if((boolean)$CHILD) return "true"; else return "false"; : false - (($CHILD)?"true":"false"): false - ((true == $CHILD)?"true":"false"): false - (((boolean)$CHILD)?"true":"false"): false $CHILD [e]: <e><f>zzz</f></e> - if($CHILD) return "true"; else return "false"; : true - if(true == $CHILD) return "true"; else return "false"; : false - if((boolean)$CHILD) return "true"; else return "false"; : true - (($CHILD)?"true":"false"): true - ((true == $CHILD)?"true":"false"): false - (((boolean)$CHILD)?"true":"false"): true -- Edit bug report at https://bugs.php.net/bug.php?id=68507&edit=1 -- Try a snapshot (PHP 5.4): https://bugs.php.net/fix.php?id=68507&r=trysnapshot54 Try a snapshot (PHP 5.5): https://bugs.php.net/fix.php?id=68507&r=trysnapshot55 Try a snapshot (trunk): https://bugs.php.net/fix.php?id=68507&r=trysnapshottrunk Fixed in SVN: https://bugs.php.net/fix.php?id=68507&r=fixed Fixed in release: https://bugs.php.net/fix.php?id=68507&r=alreadyfixed Need backtrace: https://bugs.php.net/fix.php?id=68507&r=needtrace Need Reproduce Script: https://bugs.php.net/fix.php?id=68507&r=needscript Try newer version: https://bugs.php.net/fix.php?id=68507&r=oldversion Not developer issue: https://bugs.php.net/fix.php?id=68507&r=support Expected behavior: https://bugs.php.net/fix.php?id=68507&r=notwrong Not enough info: https://bugs.php.net/fix.php?id=68507&r=notenoughinfo Submitted twice: https://bugs.php.net/fix.php?id=68507&r=submittedtwice register_globals: https://bugs.php.net/fix.php?id=68507&r=globals PHP 4 support discontinued: https://bugs.php.net/fix.php?id=68507&r=php4 Daylight Savings: https://bugs.php.net/fix.php?id=68507&r=dst IIS Stability: https://bugs.php.net/fix.php?id=68507&r=isapi Install GNU Sed: https://bugs.php.net/fix.php?id=68507&r=gnused Floating point limitations: https://bugs.php.net/fix.php?id=68507&r=float No Zend Extensions: https://bugs.php.net/fix.php?id=68507&r=nozend MySQL Configuration Error: https://bugs.php.net/fix.php?id=68507&r=mysqlcfg

« previous php.bugs (#188805) next »