ID: 34199 Updated by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] Status: Critical Bug Type: Scripting Engine problem Operating System: * PHP Version: 5CVS-2005-08-20 (CVS) New Comment:
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? Previous Comments: ------------------------------------------------------------------------ [2005-08-20 22:53:04] [EMAIL PROTECTED] 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] [EMAIL PROTECTED] 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] [EMAIL PROTECTED] 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