Bug #12775 Updated: Incorrect result using references and objects
| From: | wayne at webmotif dot com | Date: | Thu, 16 Aug 2001 20:44:45 +0000 |
| Subject: | Bug #12775 Updated: Incorrect result using references and objects | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-63472@lists.php.net to get a copy of this message | ||
ID: 12775
User updated by: wayne@webmotif.com
Reported By: wayne@webmotif.com
Status: Suspended
Bug Type: Scripting Engine problem
Operating System: All
PHP Version: 4.0.6
New Comment:
Actually, that would be a nice feature. If one could call a function on an object such as
"make_reference($this)" to change the assignment semantics for an object it would be a
great way to maintain backward compatibility but let new objects be assign-by-reference.
Anyway, the following function will do a deep copy of the object to get around this bug (if you
didn't use the words "shallow copy" I wouldn't have thought of it):
function copy_object($object)
{
$copy = $object;
$properties = get_object_vars($object);
foreach($properties as $name => $value) {
if (is_object($value)) $copy->$name = copy_object($value);
else $copy->$name = $value;
}
return $copy;
}
Previous Comments:
------------------------------------------------------------------------
[2001-08-15 18:11:10] jeroen@php.net
Shallow copying of objects and arrays bit you...
Will be fixed in PHP 5
Suspended (it could be called a 'feature' though...)
------------------------------------------------------------------------
[2001-08-15 18:00:05] wayne@webmotif.com
If you set a property of an object to a global variable, it is no longer possible to make a copy of
that object! Every "copy" becomes a reference. Example:
--/ snip /--
class foo
{
function foo()
{
$this->test = 'Test';
$GLOBALS['test'] =& $this->test;
}
}
$obj1 = new foo();
$copyOfObj1 = $obj1; // Should be a copy, but is reference
$obj1->test = "changed!";
echo $copyOfObj1->test.'<br>';
--/ snip /--
The result of this code is: "changed!" but it should be "Test". $copyOfObj1
should be a copy of $obj1, but instead it acts like a reference.
If you unset $GLOBALS['test'] then it copies as it should.
This is a bug occurs in all versions of PHP4 on all platforms (from what I can tell).
------------------------------------------------------------------------
Edit this bug report at http://bugs.php.net/?id=12775&edit=1