From:             claus-poerschke at gmx dot de
Operating system: Suse Linux 8.2
PHP version:      4.3.4
PHP Bug Type:     *General Issues
Bug description:  Call-by-Reference ends in Recursion

Description:
------------
Implementing a Composite Pattern I get an unexpected 
recursion. If I remove the &-Operator in the aPart::addChild() it 
works. Further comments are made in the code: 

Reproduce code:
---------------
#!/usr/local/bin/php
<?php

class aPart
{
        var $mChildren;
        var $mName;

        function aPart($name)
        {
                $this->mName     = $name;
                $this->mChildren = array();
        }
        function addChild(&$child)
        {
                $this->mChildren[] =& $child;
        }
        function showParts($indent='')
        {
        echo $indent . $this->mName . "\n";
                for ($i = 0;$i < sizeof($this->mChildren);$i++) {
                        $this->mChildren[$i]->showParts($indent . '   ');
                }
        }
}

$arrParts = array('bar','baz');

$objP =& new aPart('foo'); // normally i read a template File
$objP1 = $objP; // make Copy - to avoid filesystem Operation!
$objP2 = $objP; // too
$objP1->mName = $arrParts[0]; // assign bar
$objP2->mName = $arrParts[1]; // assing baz
$objP->addChild($objP1); // Add Component 1
$objP->addChild($objP2); // Add Component 2
$objP->showParts(); // show the tree
/*  Prints as expected:
foo
   bar
   baz
*/
// cleanup
unset($objP);
unset($objP1);
unset($objP2);

// try doing the above it another way
$objP =& new aPart('foo');
for ($i=0;$i<sizeof($arrParts); $i++) {
    $objP1 = $objP; // I expected a Copy here :-(
    $objP1->mName = $arrParts[$i];
    $objP->addChild($objP1);
}
$objP->showParts();// Recursion !!!


?>

Expected result:
----------------
Read the comments in the script: 
foo 
   bar 
   baz 

Actual result:
--------------
In the second example i'am getting an recursion 
foo 
   baz 
      baz 
         baz 
            baz 
              ..... 

-- 
Edit bug report at http://bugs.php.net/?id=26143&edit=1
-- 
Try a CVS snapshot (php4):  http://bugs.php.net/fix.php?id=26143&r=trysnapshot4
Try a CVS snapshot (php5):  http://bugs.php.net/fix.php?id=26143&r=trysnapshot5
Fixed in CVS:               http://bugs.php.net/fix.php?id=26143&r=fixedcvs
Fixed in release:           http://bugs.php.net/fix.php?id=26143&r=alreadyfixed
Need backtrace:             http://bugs.php.net/fix.php?id=26143&r=needtrace
Try newer version:          http://bugs.php.net/fix.php?id=26143&r=oldversion
Not developer issue:        http://bugs.php.net/fix.php?id=26143&r=support
Expected behavior:          http://bugs.php.net/fix.php?id=26143&r=notwrong
Not enough info:            http://bugs.php.net/fix.php?id=26143&r=notenoughinfo
Submitted twice:            http://bugs.php.net/fix.php?id=26143&r=submittedtwice
register_globals:           http://bugs.php.net/fix.php?id=26143&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=26143&r=php3
Daylight Savings:           http://bugs.php.net/fix.php?id=26143&r=dst
IIS Stability:              http://bugs.php.net/fix.php?id=26143&r=isapi
Install GNU Sed:            http://bugs.php.net/fix.php?id=26143&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=26143&r=float

Reply via email to