#34199 [Ctl->Csd]: SimpleXMLElement is Schroedinger's Cat
| From: | dmitry@php.net | 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