ID:               27399
 User updated by:  php dot bugs at darwin dot no-ip dot com
 Reported By:      php dot bugs at darwin dot no-ip dot com
 Status:           Bogus
 Bug Type:         Scripting Engine problem
 Operating System: Linux 2.4.18
 PHP Version:      4.3.4
 New Comment:

How is that not a bug?  Documentation leads the user to believe that "=
new" and "=& new"  only differ in efficiency.



While I see that copying an object with references inside of it might
break those references, Dummy() has no internal references.  It seems
the copy of Dummy() should work just as well as the original.


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

[2004-02-25 19:30:46] [EMAIL PROTECTED]

To get the expected result, change every "= new" to "=& new".



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

[2004-02-25 16:39:02] php dot bugs at darwin dot no-ip dot com

Description:
------------
Copying an object doesn't appear to work as expected for either a
shallow or a deep copy.  

Reproduce code:
---------------
class Dummy {}



$listA = new Dummy();

$listA->next = new Dummy();

$listA->next->previous =& $listA;

$listA->value = "one";

$listA->next->value = "two";

$listA->next->previous->value = "ONE";

echo "ListA: ";

echo "(" . $listA->value . ", " . $listA->next->value . ") \n";



$listB = $listA;

$listB->value = "three";

$listB->next->value = "four";

$listB->next->previous->value="THREE";

echo "(modified listB)\n";

echo "ListA: ";

echo "(" . $listA->value . ", " . $listA->next->value . ") \n";

echo "ListB: ";

echo "(" . $listB->value . ", " . $listB->next->value . ") \n";

Expected result:
----------------
Expected output: (ie: if PHP does a deep copy)

    ListA: (ONE, two) 

    (modified listB)

    ListA: (ONE, two) 

    ListB: (three, four) 



This should happen because $listB->next->previous is a copy of the
reference 

to $listA.  Modifying it should not modify ListA OR ListB.  



Possible (wrong) output: (if PHP had done a shallow copy)

    ListA: (ONE, two) 

    (modified listB)

    ListA: (THREE, four) 

    ListB: (three, four) 



This would be the case because listB's next would be a reference to
ListA's 

next.



Actual result:
--------------
Actual output:

    ListA: (ONE, two) 

    (modified listB)

    ListA: (THREE, two) 

    ListB: (three, four) 



This looks like PHP did something between a shallow and a deep copy.

while ListB->next is a copy, ListB->next->previous still points at
ListA. (!?!)



... For an added bonus, try replacing '= new' with '=& new' and it
looks like

PHP does a shallow copy.  From my reading of PHP documentation, I
thought PHP would always do deep (de-referencing) copies.  




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


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

Reply via email to