ID: 49269 User updated by: president at basnetworks dot net Reported By: president at basnetworks dot net Status: Open Bug Type: Class/Object related Operating System: All PHP Version: 5.3.0 New Comment:
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. Previous Comments: ------------------------------------------------------------------------ [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. ------------------------------------------------------------------------ [2009-08-16 01:20:32] president at basnetworks dot net Description: ------------ The function isset() produces an incorrect result when used on an object that implements the Iterator interface, within a foreach declaration. As illustrated below, when used outside of the foreach() declaration, isset() works as expected in the object that implements Iterator interface, returning true, causing the output 'true'. When isset() is used within the foreach() declaration on the same object, it instead returns false, causing an empty array to be used for the foreach() loop. There is no reason the isset() function should return anything different when used within the foreach() declaration block. Reproduce code: --------------- class NormalClass { public $a, $b, $c; public function __construct() { $this->a = 'a'; $this->b = 'b'; $this->c = 'c'; } } class ArrayClass implements Iterator { private $internal_array; public function __construct() { $this->internal_array = array('a', 'b', 'c'); } public function key() { return key($this->nodes); } public function current() { return current($this->nodes); } public function next() { next($this->nodes); } public function valid() { return (current($this->nodes) !== false) ? true : false; } public function rewind() { reset($this->nodes); } } $array = array('a', 'b', 'c'); $normal_object = new NormalClass(); $array_object = new ArrayClass(); echo "Array: " . (isset($array) ? 'true' : 'false'); echo "\nNormal Object: " . (isset($normal_object) ? 'true' : 'false'); echo "\nArray Object: " . (isset($array_object) ? 'true' : 'false'); echo "\nArray: "; foreach ((isset($array) ? $array : array()) as $item) { echo $item; } echo "\nNormal Object: "; foreach ((isset($normal_object) ? $normal_object : array()) as $item) { echo $item; } echo "\nArray Object: "; foreach ((isset($array_object) ? $array_object : array()) as $item) { echo $item; } Expected result: ---------------- Array: true Normal Object: true Array Object: true Array: abc Normal Object: abc Array Object: abc Actual result: -------------- Array: true Normal Object: true Array Object: true Array: abc Normal Object: abc Array Object: ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=49269&edit=1