ID: 8935
Updated by: sniper
Reported By: [EMAIL PROTECTED]
Old-Status: Duplicate
Status: Closed
Bug Type: Class/Object related
Assigned To:
Comments:
It's fixed -> closed.
--Jani
Previous Comments:
---------------------------------------------------------------------------
[2001-03-09 13:50:45] [EMAIL PROTECTED]
this has been fixed for months,
please use =& new instead of = new in this special case
---------------------------------------------------------------------------
[2001-02-24 14:14:09] [EMAIL PROTECTED]
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] [EMAIL PROTECTED]
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
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]