| 
        php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
  [2001-08-15 18:00 UTC] wayne at webmotif dot 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).  
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             
             | 
    |||||||||||||||||||||||||||
            
                 
                Copyright © 2001-2025 The PHP GroupAll rights reserved.  | 
        Last updated: Tue Nov 04 11:00:01 2025 UTC | 
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; }I always use a 'cool' workaround (forgot to mention it), it isn't extremely fast, it is simple... works on both objects, arrays, and mixes. It also preserves internal references ($obj->a =& $obj->b) The workaround? // $a = $b should have worked like this: function deep_copy(&$a,&$b) { $a = unserialize(serialize($b)); }