RE: [PHP-DEV] PHP 4.0 Bug #6529 Updated: Problems with $this in class constructor From: Michael Youngstrom (youngm <email protected>)
Date: 10/31/00

Is this a circular reference?

I only see one reference so I don't see how it is a circular reference or am
I just not understanding what a circular reference is?

Mike
P.S. This bug is related/duplicates (for whoever tracks these things) of
bugs:
#7511
#7482
#7455
#7454

-----Original Message-----
From: mathieu <email protected> [mailto:mathieu <email protected>]
Sent: Tuesday, October 31, 2000 3:55 PM
To: php-dev <email protected>
Subject: [PHP-DEV] PHP 4.0 Bug #6529 Updated: Problems with $this in
class constructor

ID: 6529
Updated by: mathieu
Reported By: k.reimer <email protected>
Status: Open
Bug Type: Scripting Engine problem
Assigned To:
Comments:

This is a circular reference (IIRC)
and that's not possible with PHP,
(Believe me, I learned the hard way:-))

Use your second example..

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

[2000-09-06 13:00:05] stas <email protected>
reclassify

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

[2000-09-04 09:38:57] k.reimer <email protected>
Hi,

Currently we are in great trouble with PHP4. We are heavily using references
to objects in our current project and we need to create a reference from a
class in the constructor of the class itself. But it is not working. I have
tested it with PHP 4.0.1 and the new PHP 4.0.2.
Finally I managed to write a short example script where it is not
working. Here is the code that is refusing to work correctly:

<?php
  class CParent {
    var $Ref;

    function setRef(&$Child) {
      $this->Ref=&$Child;
    }

    function drawRef() {
      printf(":%s:<br>n",$this->Ref->Value);
    }
  }

  class CChild {
    var $Value;

    function CChild(&$Parent) {
      $Parent->setRef($this);
    }
  }

  $Parent=new CParent;
  $Child=new CChild($Parent);
  $Child->Value="Test";
  $Parent->drawRef();
?>

This script creates a Parent-Class and a Child-Class. The constructor of the
child class connects itself to the Parent class by passing its reference to
the Parent. Then I change its property $Value to "Test" and call the Parents
drawRef()-function. The drawRef-Function is printing the Value of the
referenced object. Well, finally it is NOT printing the Value. The value
seems to be empty. But the reference is working. If a add some methods to
CChild, the Parent can call these methods through the reference. But all
properties of CChild are empty. It looks like $Parent is working with a COPY
of $Child and not with a reference. I thought there is something wrong with
the setRef()-method, where I store the Reference in the $Ref-Variable,
but...

....if I do the same in another way (Not using the constructor, instead
writing the reference from Child to Parent manually) it is working. Here is
the working code:

<?php
  class CParent {
    var $Ref;

    function setRef(&$Child) {
      $this->Ref=&$Child;
    }

    function drawRef() {
      printf(":%s:<br>n",$this->Ref->Value);
    }
  }

  class CChild {
    var $Value;

    // In this example I don't use the constructor to connect this
    // class to CParent
  }

  $Parent=new CParent;

  // Instead I call the setRef()-method manually to do it
  $Child=new CChild;
  $Parent->setRef($Child);

  $Child->Value="Test";
  $Parent->drawRef();
?>

This script is working perfectly. So I wonder why is the first script not
working? What is wrong about making a reference to $this in the constructor
of $this? And to create just more confusion: If I assign a value to
$this->Value in the constructor, this value is printed by drawRef() and
values assigned later are ignored.

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

Full Bug description available at: http://bugs.php.net/?id=6529

--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: php-dev-unsubscribe <email protected>
For additional commands, e-mail: php-dev-help <email protected>
To contact the list administrators, e-mail: php-list-admin <email protected>

-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: php-dev-unsubscribe <email protected> For additional commands, e-mail: php-dev-help <email protected> To contact the list administrators, e-mail: php-list-admin <email protected>