#34199 [Ctl]: SimpleXMLElement is Schroedinger's Cat
ID: 34199
Updated by: sniper@php.net
Reported By: rasmus@php.net
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] 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
Thread (5 messages)