From: [EMAIL PROTECTED] Operating system: Linux/WinNT PHP version: 4.0.4 PHP Bug Type: Class/Object related Bug description: A reference to 'this' can not be used in the constructor method for a class. 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(); ?> -- Edit Bug report at: http://bugs.php.net/?id=8935&edit=1 -- 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]