ID:               39449
 Comment by:       denis at edistar dot com
 Reported By:      pstradomski at gmail dot com
 Status:           Open
 Bug Type:         Scripting Engine problem
 Operating System: Linux
 PHP Version:      5.2.0
 New Comment:

I think the warning should be raised only when someone is 
trying to write the overloaded property.

Foreach and other loop constructs are readonly constructs 
except when they are using references of the overloaded 
properties.

For example:
<?php

class A{
        
        private $test = array(1,2,3,4,5);
                
        public function __get($v){
                return $this->test;
        }

}

$a = new A;

// This should not raise notice
foreach( $a->overloaded_property as $val )
        echo $val."<br />\n";

// This should raise notice
$a->overloaded_property[] = 6;

?>

Thank you,
Denis


Previous Comments:
------------------------------------------------------------------------

[2006-11-19 11:53:11] v dot anagnostos at mail dot bg

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

------------------------------------------------------------------------

[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