ID:               39337
 User updated by:  phpbugs at thequod dot de
 Reported By:      phpbugs at thequod dot de
-Status:           Bogus
+Status:           Open
 Bug Type:         Arrays related
 Operating System: Ubuntu Linux
 PHP Version:      5CVS-2006-11-01 (CVS)
 New Comment:

iliaa, thanks for taking the time to look at this.

Unfortunately I don't understand your note. A::$foo is 
overloaded in class B and there it shows the IMHO correct 
behaviour (because in class B there's "var $foo").

The expected result in the last code example would have 
been:
A: ----------------
array(1) {
  [0]=>
  int(1)
}
B: ----------------
array(1) {
  [0]=>
  int(1)
}

instead of:

A: ----------------
array(0) {
}
B: ----------------
array(1) {
  [0]=>
  int(1)
}


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

[2007-01-07 04:10:47] [EMAIL PROTECTED]

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

Notice: Indirect modification of overloaded property A::$foo 
has no effect.

This is why the assignment has no effect.

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

[2006-11-09 19:01:54] phpbugs at thequod dot de

Re: I've also said it before.. it works, if the var is set 
in the constructor. To see the diff:

------------------------------------
<?php
class A
{
        private $vars;
        function __get($v)
        {
                if( isset($this->vars[$v]) )
                        return $this->vars[$v];
                return array();
        }

        function __set($v, $vv)
        {
                echo "__set: '$v'\n";
                var_dump($vv);
                $this->vars[$v] = $vv;
        }
}

class B extends A
{
        var $foo;
}


$A = new A();
$B = new B();

echo "A: ----------------\n";
$A->foo[] = 1;
var_dump( $A->foo );

echo "B: ----------------\n";
$B->foo[] = 1;
var_dump( $B->foo );
?>
-----------------------------------

Result:
-------
A: ----------------
array(0) {
}
B: ----------------
array(1) {
  [0]=>
  int(1)
}

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

[2006-11-09 18:41:22] phpbugs at thequod dot de

Ok. I've even slept over it.

Why should this not work?

---------------------------------
<?php
class A
{
        function __get($v)
        {
                if( isset($this->var) )
                        return $this->var;
                return array();
        }
}


$A = new A();

$A->foo[] = 1;
var_dump( $A->foo );
?>
---------------------------------

It prints:
array(0) {
}

Your comment, which I've reread carefully, does not 
explain it. The temp var from __get() is first array and 
later the $var itself.

Adding a __set() method to the class shows that this does 
not get called at all.

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

[2006-11-09 00:30:50] [EMAIL PROTECTED]

I've already explained everything, just read my previous comment
carefully.

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

[2006-11-09 00:22:16] phpbugs at thequod dot de

Sorry, to reopen it again.

The "Reproduce code" in the comment above was wrong.

I've let it return "array()" always and this changes the 
output, so that it is "array()" instead of "NULL".

But still: the array does not get changed!

I've written a comment for Bug 39426, which seems to 
suffer from something related, but cannot post it, because 
it's bogus.. :/

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

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/39337

-- 
Edit this bug report at http://bugs.php.net/?id=39337&edit=1

Reply via email to