#43600 [Opn->Bgs]: static array
| From: | colder@php.net | Date: | Tue, 18 Dec 2007 14:08:39 +0000 |
| Subject: | #43600 [Opn->Bgs]: static array | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-120736@lists.php.net to get a copy of this message | ||
ID: 43600
Updated by: colder@php.net
Reported By: 6eWmA67gxAebq at jeanpierredaviau dot com
-Status: Open
+Status: Bogus
-Bug Type: Output Control
+Bug Type: Class/Object related
Operating System: win xp
PHP Version: 5.2CVS-2007-12-14 (snap)
-Assigned To:
+Assigned To: colder
New Comment:
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
unset($a) or $a = NULL; only affects the current variable, unless this
variable represents the last one holding a reference to the object, the
object won't be destroyed.
For example:
$a = new StdClass;
$b = $a;
$a = NULL; // $b is still holding the instance.
same with unset:
$a = new stdClass;
$b = $a;
unset($a); // $b is still holding the var
You could have the object destroyed by $a = NULL; if $b was a reference
to $a. but in case of arrays the array element is not removed: you
should do such cleaning manually.
The behavior you notice is expected and has nothing specific to do with
"static arrays".
Previous Comments:
------------------------------------------------------------------------
[2007-12-18 12:42:57] felipe@php.net
Documentation says:
"When assigning an already created instance of a class to a new
variable, the new variable will access the same instance as the object
that was assigned. This behaviour is the same when passing instances to
a function."
Using PHP 5.3.0-dev (cli) (built: Dec 17 2007 10:53:40):
<?php
$obj = new stdClass;
$a = $obj;
unset($obj);
var_dump($a, $obj);
?>
Output:
object(stdClass)#1 (0) {
}
NULL
------------------------------------------------------------------------
[2007-12-15 01:06:37] felipe@php.net
Clarifying example:
<?php
class foo {
static $foo = array();
static function test($obj) {
self::$foo[] = $obj;
}
}
class bar {
public function __construct() {
foo::test($this);
}
}
$a = new bar;
unset($a);
var_dump(foo::$foo); // He expects empty array
?>
------------------------------------------------------------------------
[2007-12-14 21:23:39] 6eWmA67gxAebq at jeanpierredaviau dot com
Description:
------------
a static array dont retain a modification
PHP 5.2.2 (cli) (built: May 2 2007 19:18:26)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with DBG v2.15.5, (C) 2000,2007, by Dmitri Dmitrienko
Reproduce code:
---------------
http://groups.google.com/group/alt.comp.lang.php/msg/79060a6a7c4c806e
Expected result:
----------------
print_r (Registre::getRegistre());
Array
(
[0] => info2 Object
(
[var] => 0
[class] => info2
)
)
Actual result:
--------------
$a = new info();
$b = new info2();
$a = NULL;
print_r (Registre::getRegistre()); //dont print the changed
self::$leRegistre
Array
(
[0] => info Object
(
[var] => 0
[class] => info
)
[1] => info2 Object
(
[var] => 0
[class] => info2
)
)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=43600&edit=1