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

Reply via email to