|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2001-02-24 14:14 UTC] jmoore@php.net
[2001-03-09 13:50 UTC] andre@php.net
[2001-03-09 17:09 UTC] sniper@php.net
[2001-03-09 17:26 UTC] andre@php.net
[2001-03-09 18:24 UTC] andre@php.net
[2001-03-13 05:00 UTC] johanp at aditus dot nu
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 13:00:02 2025 UTC |
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(); ?>