#33931 [Asn->Fbk]: __get and __set don't handle arrays correctly

From: Date: Fri, 16 Sep 2005 22:48:24 +0000
Subject: #33931 [Asn->Fbk]: __get and __set don't handle arrays correctly
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-85187@lists.php.net to get a copy of this message
 ID:               33931
 Updated by:       tony2001@php.net
 Reported By:      wkonkel at gmail dot com
-Status:           Assigned
+Status:           Feedback
 Bug Type:         Scripting Engine problem
 Operating System: *
 PHP Version:      5CVS-2005-08-19
 Assigned To:      dmitry
 New Comment:

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip

I'm unable to replicate it anymore.


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

[2005-08-01 09:51:38] tony2001@php.net

Dmitry, could you check it plz ?

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

[2005-07-31 20:01:33] sniper@php.net

And this with Sean's code:

PHP Notice:  Undefined property:  A::$foo in /home/jani/t.php on line
8

Notice: Undefined property:  A::$foo in /home/jani/t.php on line 8
PHP Notice:  Undefined property:  A::$foo in /home/jani/t.php on line
9

Notice: Undefined property:  A::$foo in /home/jani/t.php on line 9
PHP Notice:  Undefined variable: undefined in /home/jani/t.php on line
10

Notice: Undefined variable: undefined in /home/jani/t.php on line 10
NULL
array(2) {
  ["bar1"]=>
  string(5) "oink1"
  [0]=>
  string(4) "blah"
}
/usr/src/php/php5/Zend/zend_variables.h(45) :  Freeing 0x088ED84C (6
bytes), script=t.php
/usr/src/php/php5/Zend/zend_variables.c(120) : Actual location
(location was relayed)
Last leak repeated 1 time
/usr/src/php/php5/Zend/zend_execute.c(798) :  Freeing 0x088ED80C (16
bytes), script=t.php
Last leak repeated 1 time
/usr/src/php/php5/Zend/zend_hash.c(242) :  Freeing 0x088ED7B4 (40
bytes), script=t.php
Last leak repeated 1 time
/usr/src/php/php5/Zend/zend_execute.c(1031) :  Freeing 0x088ED754 (44
bytes), script=t.php
/usr/src/php/php5/Zend/zend_API.c(712) : Actual location (location was
relayed)
Last leak repeated 3 times
/usr/src/php/php5/Zend/zend_execute.c(1028) :  Freeing 0x088DE7CC (16
bytes), script=t.php
=== Total 11 memory leaks detected ===


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

[2005-07-31 20:00:32] sniper@php.net

Output with CVS HEAD:

Array
(
    [foo2] => bar2
    [foo3] => bar3
    [0] => blah
)
/usr/src/php/php5/Zend/zend_hash.c(242) :  Freeing 0x088EF6FC (40
bytes), script=t.php
Last leak repeated 2 times
/usr/src/php/php5/Zend/zend_variables.h(45) :  Freeing 0x088EF664 (5
bytes), script=t.php
/usr/src/php/php5/Zend/zend_variables.c(120) : Actual location
(location was relayed)
Last leak repeated 2 times
/usr/src/php/php5/Zend/zend_execute.c(798) :  Freeing 0x088EF624 (16
bytes), script=t.php
Last leak repeated 2 times
/usr/src/php/php5/Zend/zend_execute.c(1031) :  Freeing 0x088EF56C (44
bytes), script=t.php
/usr/src/php/php5/Zend/zend_API.c(712) : Actual location (location was
relayed)
Last leak repeated 3 times
/usr/src/php/php5/Zend/zend_execute.c(1028) :  Freeing 0x088DE7CC (16
bytes), script=t.php
=== Total 14 memory leaks detected ===


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

[2005-07-30 23:52:13] sean@php.net

Happens to me on 5.0.3 as well.

Shorter code:
<?php
class A {
  public function __set($key, $val) {
    $this->data[$key] = $val;
  }
}
$A = new A();
$A->foo['bar'] = 'oink';
$A->foo['bar1'] = 'oink1';
var_dump($undefined);
$undefined[] = 'blah';
var_dump($undefined);
?>

Outputs:
NULL
array(2) {
  ["bar1"]=>
  string(5) "oink1"
  [0]=>
  string(4) "blah"
}


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

[2005-07-30 22:39:55] wkonkel at gmail dot com

Description:
------------
The __set and __get don't seem to handle arrays correctly.  What's even
worse, is it adds data to memory which is allocated at a later time
($boz gets foo2 and foo3 of $myObj).  The code example speaks for
itself.  

Reproduce code:
---------------
<?

class buggy {
	private $data;
	function __set($key, $val) {
		$this->data[$key] = $val;
	}
	function __get($key) {
		return $this->data[$key];
	}
}

$myObj = new buggy();
$myObj->somevar['foo1'] = 'bar1';
$myObj->somevar['foo2'] = 'bar2';
$myObj->somevar['foo3'] = 'bar3';

$boz[] = 'blah';
print_r($boz);

?>

Expected result:
----------------
Array
(
    [0] => blah
)

Actual result:
--------------
Array
(
    [foo2] => bar2
    [foo3] => bar3
    [0] => blah
)


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


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


Thread (11 messages)

« previous php.bugs (#85187) next »