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