ID: 49269 User updated by: president at basnetworks dot net -Summary: isset() fails on Iterator object when used inside foreach declaration Reported By: president at basnetworks dot net Status: Open Bug Type: Class/Object related Operating System: All PHP Version: 5.3.0 New Comment:
sjoerd-php at linuxonly dot nl, Your code sample is much clearer, and seems to narrow it down to the ternary operator mis-behaving. Thanks for the added clarification, I will update the report. You should also "vote" that you reproduced the bug above. Previous Comments: ------------------------------------------------------------------------ [2009-08-16 10:57:44] sjoerd-php at linuxonly dot nl Note that the Iterator in my previous comment sucks and should not be used. ------------------------------------------------------------------------ [2009-08-16 10:53:07] sjoerd-php at linuxonly dot nl Thank you for your bug report. I could reproduce the behavior and made a code sample to reproduce it: <?php class TestObject implements Iterator { private $first = true; function valid() { if ($this->first) { $this->first = false; return true; } return false; } function current() { } function next() { } function key() { } function rewind() { } } $array_object = new TestObject(); // Without ternary operator, the foreach is entered foreach ($array_object as $item) { echo "This works.\n"; } // With ternary operator, the foreach is not entered foreach ((true ? $array_object : $array_object) as $item) { die("Good. Expected behavior.\n"); } die("Bad. Foreach was skipped.\n"); ?> ------------------------------------------------------------------------ [2009-08-16 10:52:20] sjoerd-php at linuxonly dot nl Thank you for your bug report. I could reproduce the behavior and made a code sample to reproduce it: <?php class TestObject implements Iterator { private $first = true; function valid() { if ($this->first) { $this->first = false; return true; } return false; } function current() { } function next() { } function key() { } function rewind() { } } $array_object = new TestObject(); // Without ternary operator, the foreach is entered foreach ($array_object as $item) { echo "This works.\n"; } // With ternary operator, the foreach is not entered foreach ((true ? $array_object : $array_object) as $item) { die("Good. Expected behavior.\n"); } die("Bad. Foreach was skipped.\n"); ?> ------------------------------------------------------------------------ [2009-08-16 01:36:43] president at basnetworks dot net After further testing, I have found this bug is stranger than it seems: foreach ((isset($array_object) ? $array_object : array('1', '2', '3')) as $item) { echo $item; } Should either print 'abc' or '123' no matter if isset() is successful or fails. It prints neither. Now I am wondering if it is not isset(), but the ternary operator that is failing. ------------------------------------------------------------------------ [2009-08-16 01:28:52] president at basnetworks dot net I addition to the reproduce code, the following may help to understand the bug: foreach ($array_object as $item) { echo $item; } Will successfully print "abc", while: foreach ((isset($array_object) ? $array_object : array()) as $item) { echo $item; } will not print anything, indicating that isset() is returning false. I hope that helps. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/49269 -- Edit this bug report at http://bugs.php.net/?id=49269&edit=1