PHP 4.0 Bug #8935 Updated: A reference to 'this' can not be used in the constructor method for a class.
| From: | andre@php.net | Date: | Fri, 09 Mar 2001 18:50:45 +0000 |
| Subject: | PHP 4.0 Bug #8935 Updated: A reference to 'this' can not be used in the constructor method for a class. | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-48446@lists.php.net to get a copy of this message | ||
ID: 8935
Updated by: andre
Reported By: johanp@aditus.nu
Old-Status: Open
Status: Duplicate
Bug Type: Class/Object related
Assigned To:
Comments:
this has been fixed for months,
please use =& new instead of = new in this special case
Previous Comments:
---------------------------------------------------------------------------
[2001-02-24 14:14:09] jmoore@php.net
Please see the 4.0.4 release change log a lot of things along this line were fixed.
James
---------------------------------------------------------------------------
[2001-01-26 09:37:16] johanp@aditus.nu
The following script demonstrates the problem.
<?php
/*
thistest.php
jp, 2001-01-25
Demonstration of bug in passing '$this' as a reference in the constructor.
The problem is that it will not be a reference to the newly created object that is passed but rather
a new copy. This is demonstrated below.
The Container class is just a driver class
The bug is demostrated in the A1 class. The A class uses an Init() method to pass the
'$this' reference which is a workaround for this particular bug.
Analysis of problem:
It seems that the '$this' pointer is not safe to use in the constructor since it probably
doesn't get properly initialized for the object until after the constructor has been run.
*/
class ContainerA {
var $a;
function ContainerA() {
$this->a=new A();
$this->a->Init();
echo "A val before calling change: ".$this->a->val."<br>";
$this->a->bobj->ChangeA();
echo "A val after calling change (should be 3):
".$this->a->val."<br>";
}
}
class A {
var $val=1;
var $bobj=null;
function A() {
$this->bobj = new B();
}
function Init() {
// Workaround it is safe to use a refernce to this outside the constuctor
$this->bobj->Init(&$this);
}
function SetVal($v) {
$this->val=$v;
}
};
class B {
var $aobj=null;
function B() {
}
function Init(&$obj) {
$this->aobj=&$obj;
}
function ChangeA() {
$this->aobj->SetVal(3);
}
};
class ContainerA1 {
var $a;
function ContainerA1() {
$this->a=new A1();
echo "A val before calling change: ".$this->a->val."<br>";
$this->a->bobj->ChangeA();
echo "A val after calling change (should be 3):
".$this->a->val."<br>";
}
}
// BUG
class A1 {
var $val=1;
var $bobj=null;
function A1() {
$this->bobj = new B();
// BUG. A reference of 'this' is NOT passed here as it seems but a copy!
// Hence the bobj will contain another copy of A1 and not the one we
// are just creating.
$this->bobj->Init(&$this);
}
function SetVal($v) {
$this->val=$v;
}
};
echo "Demonstration of 'this' bug.<p>";
echo "Using class A (workaround)<br>";
$c1=new ContainerA();
echo "<p>Using class A1 (BUG)<br>";
$c1=new ContainerA1();
?>
---------------------------------------------------------------------------
ATTENTION! Do NOT reply to this email!
To reply, use the web interface found at http://bugs.php.net/?id=8935&edit=2