#30394 [Ver->Csd]: Assignment operators yield wrong result with __get/__set
| From: | dmitry@php.net | Date: | Fri, 03 Jun 2005 15:39:33 +0000 |
| Subject: | #30394 [Ver->Csd]: Assignment operators yield wrong result with __get/__set | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-79859@lists.php.net to get a copy of this message | ||
ID: 30394
Updated by: dmitry@php.net
Reported By: php at hartwerk dot com
-Status: Verified
+Status: Closed
Bug Type: Zend Engine 2 problem
Operating System: Linux
PHP Version: 5CVS-STABLE-03-23
New Comment:
Fixed in PHP_5_0.
This bug was already fixed in HEAD long time ago with new garbage
collector.
Previous Comments:
------------------------------------------------------------------------
[2005-03-23 22:51:34] tony2001@php.net
With clean 5.0.x-CVS I get:
2
Fatal error: Unsupported operand types in index.php on line 23
with the code below.
HEAD works just fine.
------------------------------------------------------------------------
[2004-11-04 16:10:03] tony2001@php.net
It's 5.0.x specific bug.
------------------------------------------------------------------------
[2004-10-15 18:46:51] php at hartwerk dot com
An easier work-around would be $c->a = $c->a + max( 0, 1 ), but
work-arounds do not solve bugs..
------------------------------------------------------------------------
[2004-10-15 12:13:47] ante dot dfg at moj dot net
This code works if you return the value from _get via reference....
try:
public function &__get( $what ) {
return $this->_p[ $what ];
}
------------------------------------------------------------------------
[2004-10-11 11:24:19] php at hartwerk dot com
Description:
------------
When there is a function on the right-hand side of an assignment
operator expression, and the variable is to be accessed via
__get/__set, the operation yields wrong results.
Reproduce code:
---------------
class Container
{
public function __get( $what )
{
return $this->_p[ $what ];
}
public function __set( $what, $value )
{
$this->_p[ $what ] = $value;
}
private $_p = array();
}
$c = new Container();
$c->a = 1;
$c->a += 1;
print $c->a; // --> 2
print " - ";
$c->a += max( 0, 1 );
print $c->a; // --> 4 (!)
Expected result:
----------------
2 - 3
Actual result:
--------------
2 - 4
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=30394&edit=1