ID: 39449 Comment by: v dot anagnostos at mail dot bg Reported By: pstradomski at gmail dot com Status: Open Bug Type: Scripting Engine problem Operating System: Linux PHP Version: 5.2.0 New Comment:
Reproduce code: --------------- <?php class A{ private $test = array(1,2,3,4,5); public function __get($v){ return $this->test; } } $a = new A; foreach( $a->overloaded_property as $val ) echo $val."<br />\n"; ?> Expected result: ---------------- 1 2 3 4 5 Actual result: -------------- Notice: Indirect modification of overloaded property A::$overloaded_property has no effect in C:\Apache\htdocs\dancho\index.php on line 15 1 2 3 4 5 Previous Comments: ------------------------------------------------------------------------ [2006-11-14 20:31:16] cboden at gmail dot com In the above example: $a->arr[]='d'; produced the expected results in PHP-5.1 but now gives the following error in PHP-5.2 "Notice: Indirect modification of overloaded property" ------------------------------------------------------------------------ [2006-11-09 14:05:23] pstradomski at gmail dot com Reopening. This should never be "expected behaviour". This way encapsulation got severly broken - __get was introduced to allow dynamic creation of properties - and therefore implementation of record-like classes. Such properties were meant to be indistinguishable from standard properties - but aren't. Neither passing by reference works, nor array elements do. Developer can expect to be able to modify object properties for example in such a way: $x->arr = array('a'); array_push($x->arr, 'b'); Now it is impossible - although it should be. I understand previous behaviour could be considered improper, bu now developers don't even get a chance to choose between passing by value and passing by reference. ------------------------------------------------------------------------ [2006-11-09 13:50:54] [EMAIL PROTECTED] This is expected behaviour. ------------------------------------------------------------------------ [2006-11-09 13:43:27] pstradomski at gmail dot com Description: ------------ It is now impossible to implement overloaded array properties. Array returned via __get is now a copy (not a reference as in 5.1.x) and it is impossible to force getter to pass a reference. Reproduce code: --------------- <?php class A { public function & __get($val) { return $this->keys[$val]; } public function __set($k, $v) { $this->keys[$k] = $v; } private $keys = array(); } $a =new A(); $a->arr = array('a','b','c'); $b = &$a->arr; $b[]= 'd'; foreach ($a->arr as $k => $v) { echo "$k => $v\n"; } $a->arr[]='d'; foreach ($a->arr as $k => $v) { echo "$k => $v\n"; } ?> Expected result: ---------------- 0 => a 1 => b 2 => c 3 => d 0 => a 1 => b 2 => c 3 => d 4 => d Actual result: -------------- Notice: Indirect modification of overloaded property A::$arr has no effect in /home/pawel/tmp/a.php on line 18 Notice: Indirect modification of overloaded property A::$arr has no effect in /home/pawel/tmp/a.php on line 21 0 => a 1 => b 2 => c Notice: Indirect modification of overloaded property A::$arr has no effect in /home/pawel/tmp/a.php on line 25 Notice: Indirect modification of overloaded property A::$arr has no effect in /home/pawel/tmp/a.php on line 27 0 => a 1 => b 2 => c ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=39449&edit=1