#6529 [Com]: Problems with $this in class constructor
| From: | mcp21 at cam dot ac dot uk | Date: | Tue, 29 Apr 2003 10:00:31 +0000 |
| Subject: | #6529 [Com]: Problems with $this in class constructor | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-38697@lists.php.net to get a copy of this message | ||
ID: 6529
Comment by: mcp21 at cam dot ac dot uk
Reported By: k dot reimer at twisd dot de
Status: Closed
Bug Type: Scripting Engine problem
Operating System: Linux
PHP Version: 4.0.2
New Comment:
Have been wanting to do a similar thing; it seems to be fixed now by
using a reference with the CChild constructor:
i.e.
$Child=&new CChild($Parent);
Previous Comments:
------------------------------------------------------------------------
[2000-11-20 09:04:33] jmoore@php.net
This should be fixed in latest CVS. (At least as much as it ever will
be). Please look at the discussions on php-dev about this and reopen if
you feel its still outstanding.
James
------------------------------------------------------------------------
[2000-10-31 17:55:02] mathieu@php.net
This is a circular reference (IIRC)
and that's not possible with PHP,
(Believe me, I learned the hard way:-))
Use your second example..
------------------------------------------------------------------------
[2000-09-06 13:00:05] stas@php.net
reclassify
------------------------------------------------------------------------
[2000-09-04 09:38:57] k dot reimer at twisd dot 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.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=6529&edit=1