Re: PHP 4.0 Bug #6529 Updated: Problems with $this in class constructor

From: Date: Wed, 01 Nov 2000 03:34:18 +0000
Subject: Re: PHP 4.0 Bug #6529 Updated: Problems with $this in class constructor
References: 1  Groups: php.dev 
Request: Send a blank email to php-dev+get-36576@lists.php.net to get a copy of this message
On Wed, 01 Nov 2000, you wrote: >Is this a circular reference? > It _is_not_ a circular reference. The effect (I wont call it a problem/bug because it is quite reasonable, just not documented ) is due to the fact that the object is not completely 'created' until after the constructor has finished and accordingly $this does not reference a valid object in the constructor. To see what really goes on check out the zend source code. >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@php.net [mailto:mathieu@php.net] >Sent: Tuesday, October 31, 2000 3:55 PM >To: php-dev@lists.php.net >Subject: [PHP-DEV] PHP 4.0 Bug #6529 Updated: Problems with $this in >class constructor > > >ID: 6529 >Updated by: mathieu >Reported By: k.reimer@twisd.de >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@php.net >reclassify > >--------------------------------------------------------------------------- > >[2000-09-04 09:38:57] k.reimer@twisd.de >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 > > -- Regards, Alan van den Bosch Sanguis Pty Ltd /* All generalizations are false. */

« previous php.dev (#36576) next »