From:             stochnagara at hotmail dot com
Operating system: 
PHP version:      5CVS-2005-09-11 (snap)
PHP Bug Type:     Class/Object related
Bug description:  foreach + __get + __set incosistency

Description:
------------
There is some incostistency with foreach and a class which has __get and
__set methods. I don't know what is the intended behaviour but there is a
problem there when assigning a foreach key or value to an overloaded
member of such class.

See comments in the expected result region.

Reproduce code:
---------------
<? class abc {
        function __set ($key, $value) { echo "__set ($key,$value)<br/>";
$this->arr[$key] = $value; }
        function /*&*/ __get ($key) { echo "__get ($key)<br/>"; return
$this->arr[$key]; } 
        function __isset ($key) { echo "__isset ($key)<br/>"; return isset
($this->arr[$key]); }
        function __unset ($key) { echo "__unset ($key)<br/>"; unset
($this->arr[$key]); }
        private $arr;
}
$abc = new abc();
foreach (array (1,2,3) as $abc->k => $v) {
        print_r($abc);echo ';'; var_dump($abc->k);echo ';';
}
$abc->k = 4;
echo '-----<br/>';
foreach (array (1,2,3) as $abc->k => $v) {
        print_r($abc);echo ';'; var_dump($abc->k);echo ';';
}
echo '<br/>-----<br/>';
$abc_value = new abc();
foreach (array (1,2,3) as $v => $abc_value->k) {
        print_r($abc_value);echo ';'; var_dump($abc_value->k);echo ';';
}


Expected result:
----------------
Depends of specification.

Case 1 : First foreach fills $arr with keys. Others are ok.
Case 2 : Second foreach does not fill $arr with keys.

Note 1! 
When __get is changed to return by reference, first foreach behaves
exactly like the second one.

Note 2!
Third foreach calls __set while first and second do not.

Actual result:
--------------
__get (k)
abc Object ( [arr:private] => Array ( ) ) ;__get (k)
NULL ;__get (k)
abc Object ( [arr:private] => Array ( ) ) ;__get (k)
NULL ;__set (k,4)
-----
__get (k)
abc Object ( [arr:private] => Array ( [k] => 0 ) ) ;__get (k)
int(0) ;__get (k)
abc Object ( [arr:private] => Array ( [k] => 1 ) ) ;__get (k)
int(1) ;
-----
__set (k,1)
abc Object ( [arr:private] => Array ( [k] => 1 ) ) ;__get (k)
int(1) ;__set (k,2)
abc Object ( [arr:private] => Array ( [k] => 2 ) ) ;__get (k)
int(2) ;

-- 
Edit bug report at http://bugs.php.net/?id=34467&edit=1
-- 
Try a CVS snapshot (php4):   http://bugs.php.net/fix.php?id=34467&r=trysnapshot4
Try a CVS snapshot (php5.0): 
http://bugs.php.net/fix.php?id=34467&r=trysnapshot50
Try a CVS snapshot (php5.1): 
http://bugs.php.net/fix.php?id=34467&r=trysnapshot51
Fixed in CVS:                http://bugs.php.net/fix.php?id=34467&r=fixedcvs
Fixed in release:            http://bugs.php.net/fix.php?id=34467&r=alreadyfixed
Need backtrace:              http://bugs.php.net/fix.php?id=34467&r=needtrace
Need Reproduce Script:       http://bugs.php.net/fix.php?id=34467&r=needscript
Try newer version:           http://bugs.php.net/fix.php?id=34467&r=oldversion
Not developer issue:         http://bugs.php.net/fix.php?id=34467&r=support
Expected behavior:           http://bugs.php.net/fix.php?id=34467&r=notwrong
Not enough info:             
http://bugs.php.net/fix.php?id=34467&r=notenoughinfo
Submitted twice:             
http://bugs.php.net/fix.php?id=34467&r=submittedtwice
register_globals:            http://bugs.php.net/fix.php?id=34467&r=globals
PHP 3 support discontinued:  http://bugs.php.net/fix.php?id=34467&r=php3
Daylight Savings:            http://bugs.php.net/fix.php?id=34467&r=dst
IIS Stability:               http://bugs.php.net/fix.php?id=34467&r=isapi
Install GNU Sed:             http://bugs.php.net/fix.php?id=34467&r=gnused
Floating point limitations:  http://bugs.php.net/fix.php?id=34467&r=float
No Zend Extensions:          http://bugs.php.net/fix.php?id=34467&r=nozend
MySQL Configuration Error:   http://bugs.php.net/fix.php?id=34467&r=mysqlcfg

Reply via email to