ID: 8935
Updated by: andre
Reported By: [EMAIL PROTECTED]
Old-Status: Duplicate
Status: Closed
Bug Type: Class/Object related
Assigned To: 
Comments:



Previous Comments:
---------------------------------------------------------------------------

[2001-03-09 17:26:53] [EMAIL PROTECTED]
not really this is only a duplicate report for an already
fixed bug...

---------------------------------------------------------------------------

[2001-03-09 17:09:08] [EMAIL PROTECTED]
It's fixed -> closed.

--Jani


---------------------------------------------------------------------------

[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();

?>

---------------------------------------------------------------------------

The remainder of the comments for this report are too long.  To view the rest of the 
comments, please view the bug report online.


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]

Reply via email to