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]

Reply via email to