ID:               41641
 Updated by:       [EMAIL PROTECTED]
 Reported By:      asnyder at mddev dot com
-Status:           Open
+Status:           Bogus
 Bug Type:         Scripting Engine problem
 Operating System: Linux Fedora Core 4
 PHP Version:      5.2.3
 New Comment:

>But it DOES have an affect.
But the code is STILL wrong, that's what the warning is trying to tell
you.


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

[2007-06-25 19:39:07] asnyder at mddev dot com

But it DOES have an affect. It did change the SomeVariable value of the
actual object regardless of the __get returning by value. In these
situations it should NOT trigger the warning. Run the example, and store
values in the SomeVariable, you'll see that the actual value DOES get
changed. Lets not just assume things without atually reading and running
the example. If you were in this situation you would most definately not
want it to throw this warning. Realize that much of the Web 2.0 movement
using php relise on the __get, and __set methods, and in throwing this
warning higly discourages it's use, even when the application of it,
such as my example is perfectly legitimate and valid.

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

[2007-06-25 19:11:26] [EMAIL PROTECTED]

The __get() function returns by value, not by reference, hence the
warning.

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

[2007-06-11 14:57:33] asnyder at mddev dot com

How is this bogus? The code DOES indeed make a change. Why should one
have to call SetSomething, instead of the automatic __set triggering and
making the modification.

I don't understand your logic. I have many applications that use this
logic, and the applicatios worked properly before, with the new notice
they don't, unless I explicitly call the function.

What are your thoughts on this?

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

[2007-06-11 14:52:51] [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

It did not properly work in PHP 5.1.x either, now we emit this warning
so that you can deal with the broken code.

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

[2007-06-08 22:50:01] asnyder at mddev dot com

Description:
------------
Ok, the bug is as follows. If one gets an array, via the __get, and
then continues to modify the subobject properties using a __set. It will
call the __set function, but throw the 

Notice: Indirect modification of overloaded property A::$Test has no
effect in /var/www/html/Tests/PHPBug.php on line 43

In PHP 5.1.2 this process worked fine, but in 5.2.3 it causes the
notice.

Reproduce code:
---------------
class A
{
        private $Test = array("One" => null, 'Two' => null);
        
        function A()
        {
                $this->Test['One'] = new B();
        }
        function __get($val)
        {
                return $this->Test;
        }
}
class B
{
        private $SomeVariable;
        
        function GetSomething(){return $this->SomeVariable;}
        function SetSomething($bool)
        {
                $this->SomeVariable = $bool;
        }
        function __get($val)
        {
                $this->GetSomething();
        }
        function __set($part, $val)
        {
                $this->SetSomething($val);
        }
}
$tmpA = new A();


// Now in PHP 5.1.2 the following code works, in PHP 5.2.3 but throws
the notice Indirect modification of overloaded property
$tmpA->Test['One']->Something = true;
//In PHP 5.2.3 one would have to do the following for the notice not to
throw. Which is not the expected behavior
//$tmpA->Test['One']->SetSomething(true);

Expected result:
----------------
The SetSomething($val) function should be called, and it IS being
called, but with throwing a notice. It should behave like in 5.1.2 and
run the SetSomething($val) function without the notice.

One should NOT have to call $tmpA->Test['One']->SetSomething(true) to
not raise the notice.

Actual result:
--------------
Calls function and throws notice.


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


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

Reply via email to