From: bobalong at gmx dot net Operating system: Redhat 9 PHP version: 4.3.4 PHP Bug Type: Zend Engine 2 problem Bug description: call-by-value on objects doesn't work
Description: ------------ I've created a user-defined list type - a bit like the ubiquitous ArrayList - and wrapped it in another class, which exposes part of the internal list's interface... OK, so nothing radical so far. My problem is that when I make use of the list's exposed interface in the wrapper class, it becomes a reference type for no apparent reason. Another consequence, due to a previous bug (http://bugs.php.net/bug.php?id=20993), is that if I pass the wrapper object to a function that modifies the internal list, the original object gets modified too, as though I'd passed it by reference! Reproduce code: --------------- <pre> <? //define a user type, similar to an ArrayList Class MyList { var $internalArray = array(); function Add($obj) { array_push($this -> internalArray, $obj); } function Remove($index) { unset($this -> internalArray[$index]); } } //create a wrapper for the above list Class MyListWrapper { var $myList; function MyListWrapper() { $this -> myList = new MyList(); } function AddItem($item) { $this -> myList -> Add($item); } function RemoveItem($index) { $this -> myList -> Remove($index); } } //function that modifies the wrapper's internal list function UpdateListWrapper($listWrapper) { $listWrapper -> RemoveItem(0); } //1. create a new wrapper object and dump $listWrapper = new MyListWrapper(); var_dump($listWrapper); //2. now add item to wrapper object and dump $listWrapper -> AddItem("id"); var_dump($listWrapper); //notice the list is now a reference type //3. now pass to modification function UpdateListWrapper($listWrapper); //4. see the original has been modified, as if // call-by-reference had been used var_dump($listWrapper); ?> </pre> Expected result: ---------------- object(mylistwrapper)(1) { ["myList"]=> object(mylist)(1) { ["internalArray"]=> array(0) { } } } object(mylistwrapper)(1) { ["myList"]=> object(mylist)(1) { ["internalArray"]=> array(1) { [0]=> string(2) "id" } } } object(mylistwrapper)(1) { ["myList"]=> object(mylist)(1) { ["internalArray"]=> array(1) { [0]=> string(2) "id" } } } Actual result: -------------- object(mylistwrapper)(1) { ["myList"]=> object(mylist)(1) { ["internalArray"]=> array(0) { } } } object(mylistwrapper)(1) { ["myList"]=> &object(mylist)(1) { ["internalArray"]=> array(1) { [0]=> string(2) "id" } } } object(mylistwrapper)(1) { ["myList"]=> &object(mylist)(1) { ["internalArray"]=> array(0) { } } } -- Edit bug report at http://bugs.php.net/?id=28397&edit=1 -- Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=28397&r=trysnapshot4 Try a CVS snapshot (php5): http://bugs.php.net/fix.php?id=28397&r=trysnapshot5 Fixed in CVS: http://bugs.php.net/fix.php?id=28397&r=fixedcvs Fixed in release: http://bugs.php.net/fix.php?id=28397&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=28397&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=28397&r=needscript Try newer version: http://bugs.php.net/fix.php?id=28397&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=28397&r=support Expected behavior: http://bugs.php.net/fix.php?id=28397&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=28397&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=28397&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=28397&r=globals PHP 3 support discontinued: http://bugs.php.net/fix.php?id=28397&r=php3 Daylight Savings: http://bugs.php.net/fix.php?id=28397&r=dst IIS Stability: http://bugs.php.net/fix.php?id=28397&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=28397&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=28397&r=float
