#34199 [Ctl->Csd]: SimpleXMLElement is Schroedinger's Cat

From: Date: Mon, 12 Sep 2005 11:54:37 +0000
Subject: #34199 [Ctl->Csd]: SimpleXMLElement is Schroedinger's Cat
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-84928@lists.php.net to get a copy of this message
ID: 34199 Updated by: dmitry@php.net Reported By: rasmus@php.net -Status: Critical +Status: Closed Bug Type: Scripting Engine problem Operating System: * PHP Version: 5CVS-2005-08-20 (CVS) New Comment: Fixed in CVS HEAD and PHP_5_1. Now we call cast handler in both situations. According to Jani's question - yes. In PHP5, an "empty" object is true. However you can use "zend.ze1_compatibility_mode". Previous Comments: ------------------------------------------------------------------------ [2005-08-23 03:56:10] sniper@php.net This outputs nothing with PHP 5, but does give "yes" with 4.4: <?php $foo = new StdClass(); if(!$foo) echo "empty object: yes"; ?> So in PHP5, an "empty" object is still true. (then again, empty array() is considered false) Was the change intentional? And if so, why? ------------------------------------------------------------------------ [2005-08-20 22:53:04] rasmus@php.net Marking it critical. I think we need to get this cleaned up before 5.1 goes out. Having 2 different opcodes handling this that can potentially return conflicting results causes all sorts of confusion. Took me about an hour working backwards through assumptions before I finally figured out that if() and if(!) were to blame. ------------------------------------------------------------------------ [2005-08-20 22:33:31] rrichards@php.net if ($kids) if handled by ZEND_JMPZ_SPEC_CV_HANDLER which ends up calling i_zend_is_true and returning TRUE because $kids is an object. if (! $kids) is handled by ZEND_BOOL_NOT_SPEC_CV_HANDLER which calls convert_to_boolean and ends up calling the objects cast_object handler, which in this case is sxe_object_cast and returns FALSE because object is really empty. ------------------------------------------------------------------------ [2005-08-20 21:13:15] rasmus@php.net Description: ------------ An empty SimpleXMLElement object is both true and false Reproduce code: --------------- $xml = "<root></root>"; $xml = simplexml_load_string($xml); $kids = $xml->children(); if($kids) echo "True"; if(!$kids) echo "False"; Expected result: ---------------- False Actual result: -------------- TrueFalse ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=34199&edit=1

« previous php.bugs (#84928) next »