ID: 8661
Updated by: stas
Reported By: [EMAIL PROTECTED]
Old-Status: Open
Status: Analyzed
Bug Type: Scripting Engine problem
Assigned To: 
Comments:

Zend copies arrays and objects "shallow" (for performance
reasons). The workaround is to implement "clone" method.
This probably should be built-in function in Zend. 

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

[2001-02-28 00:21:05] [EMAIL PROTECTED]
My bad, my email address is [EMAIL PROTECTED]

Please detail on a fix for this bug.

Thanks,
Larry

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

[2001-01-11 16:55:42] [EMAIL PROTECTED]
The workaround that I have had to implement is doing an explicit clone method (similar 
to a copy constructor) and when making a copy, say

$new = $old->clone();

instead of 
$new = $old;

example implementation:

class Element
{
   var $value;
   function &clone()
   {
      $obj = new Element();
      $obj=>value = $this->value;
   }
}
class X
{
  var $array;
  function &clone()
  {
    $obj = new X();
    foreach($this->array as $index => $value)
    {
       $obj->array[$index] = $value->clone();
    }

    return $obj;
  }
}

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

[2001-01-11 16:46:44] [EMAIL PROTECTED]
Yes, this is the same, if I change the method to
do_nothing() in the Element class and print out a message,
the same behavior happens.  The behavior is that if I call a method on an array object 
after the array has been copied, the copy now refers to the original.  Also, if the 
method is called on the original object, the copy is then linked with the original.

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

[2001-01-11 16:41:44] [EMAIL PROTECTED]
This might be the same as 8130, but I'm not sure.


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

[2001-01-11 16:27:34] [EMAIL PROTECTED]
<?php
// buggy.php


// If I leave both A1 and A2 commented out, the code works fine.
// If I uncomment A1 only, the code works as expected
// If I uncomment A2 only, the code does not work as expected


class Element
{
    var $val;
    function set_value($newval)
    {
        $this->val = $newval;
    }
}

class Owner
{
    var $elementArray;
    function dump()
    {
        foreach ($this->elementArray as $index => $value)
        {
            print("index [$index] value [$value->val]<BR>");
        }
    }
}

$myOwner = new Owner();
$myOwner->elementArray[0] = new Element;

// -- A1 --
// this works as expected
$myOwner->elementArray[0]->val = 10;

// -- A2 --
// if this line is uncommented the code does not work as expected
//$myOwner->elementArray[0]->set_value(10);

print("dump myOwner<BR>");
$myOwner->dump();
print("<BR>");

print("make a copy of myOwner<BR>");
$copyOwner = $myOwner;
print("<BR>");

print("dump copyOwner<BR>");
$copyOwner->dump();
print("<BR>");

print("change copyOwner index 0 to 999999<BR>");

$copyOwner->elementArray[0]->val = 999999;

print("dump copyOwner<BR>");
$copyOwner->dump();
print("<BR>");

print("dump myOwner<BR>");
$myOwner->dump();
print("<BR>");

?>


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

The remainder of the comments for this report are too long.  To view the rest of the 
comments, please view the bug report online.


ATTENTION! Do NOT reply to this email!
To reply, use the web interface found at http://bugs.php.net/?id=8661&edit=2


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to