ID: 34467 Updated by: [EMAIL PROTECTED] Reported By: stochnagara at hotmail dot com -Status: Assigned +Status: Closed Bug Type: Class/Object related Operating System: * PHP Version: 5CVS-2005-09-11 Assigned To: dmitry New Comment:
Fixed in HEAD and PHP_5_1. Previous Comments: ------------------------------------------------------------------------ [2005-09-12 13:27:47] [EMAIL PROTECTED] Dmitry, check this out please. I get some leaks too with latest CVS. (PHP_5_1 branch) ------------------------------------------------------------------------ [2005-09-12 11:36:41] stochnagara at hotmail dot com That's the shortest I can (run this sample with function & __get too). <? class abc { function __set ($key, $value) { $this->arr[$key] = $value; } function __get ($key) { return $this->arr[$key]; } private $arr; } $abc = new abc(); foreach (array (1,2,3) as $abc->k => $v) print_r($abc); $abc->k = 4; foreach (array (1,2,3) as $abc->k => $v) print_r($abc); $abc_value = new abc(); foreach (array (1,2,3) as $v => $abc_value->k) print_r($abc_value); ?> ------------------------------------------------------------------------ [2005-09-12 10:13:52] stochnagara at hotmail dot com This is the link to a zip containing all 6 test cases. http://debian.fmi.uni-sofia.bg/~kapitancho/bug34667.zip In tests 4, 5 and 6 function __get returns by reference while in 1, 2 and 3 does not. Tests 1 and 4 show foreach behavoiur when the overloaded property used as key is not initialized. Tests 2 and 5 show foreach behavoiur when the overloaded property used as key is initialized. Tests 3 and 4 show foreach behavoiur when the overloaded property is used as value. If you need more information I will provide it:) ------------------------------------------------------------------------ [2005-09-12 00:33:13] [EMAIL PROTECTED] Thank you for this bug report. To properly diagnose the problem, we need a short but complete example script to be able to reproduce this bug ourselves. A proper reproducing script starts with <?php and ends with ?>, is max. 10-20 lines long and does not require any external resources such as databases, etc. If possible, make the script source available online and provide an URL to it here. Try to avoid embedding huge scripts into the report. ------------------------------------------------------------------------ [2005-09-11 22:27:25] stochnagara at hotmail dot com 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 this bug report at http://bugs.php.net/?id=34467&edit=1