PHP 4.0 Bug #7454 Updated: $this in constructor is different than instaniated object
| From: | waldschrott@php.net | Date: | Wed, 06 Dec 2000 21:47:51 +0000 |
| Subject: | PHP 4.0 Bug #7454 Updated: $this in constructor is different than instaniated object | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-40260@lists.php.net to get a copy of this message | ||
ID: 7454
Updated by: waldschrott
Reported By: heathmike@hotmail.com
Status: Closed
Bug Type: Class/Object related
Assigned To:
Comments:
fixed in latest CVS, but you'll have to use
$bar1 = &new foo('constructor1');
$bar2 = &new foo('constructor2');
$bar3 = &new foo('constructor3');
in these cases instead, please check it out
Previous Comments:
---------------------------------------------------------------------------
[2000-11-27 14:53:49] waldschrott@php.net
simplified and extended testcase
<?php
class foo {
function foo($name) {
$GLOBALS['List']= &$this;
$this->Name = $name;
$GLOBALS['List']->echoName(); }
function echoName() {
echo "<br>".$this->Name; } }
function &foo2(&$foo) {
return $foo; }
$bar1 = new foo('constructor1');
//$bar1 = foo2(new foo('constructor1'));
$bar1->Name = 'outside1';
$bar1->echoName();
$List->echoName();
echo '<P>';
?>
---------------------------------------------------------------------------
[2000-11-27 07:17:16] sniper@php.net
reclassify
---------------------------------------------------------------------------
[2000-10-25 12:59:48] heathmike@hotmail.com
Trying to store a reference to $this from inside the constructor does not store the same reference
that new class() returns. The following example shows that.
<?php
class foo {
var $Name;
function foo($name) {
Global $List;
$List[] = &$this;
$this->Name = $name;
}
function echoName() {
echo "<br>".$this->Name;
}
}
$bar1 = new foo('constructor1');
$bar2 = new foo('constructor2');
$bar3 = new foo('constructor3');
$bar1->Name = 'outside1';
$bar2->Name = 'outside2';
$bar3->Name = 'outside3';
// $bar1..3 have been changed as shown below
$bar1->echoName();
$bar2->echoName();
$bar3->echoName();
// $list however contains a copy becuase it's values have not been changed
while (list($key, $val) = each($List)) {
$val->echoName();
}
?>
Either a copy is being made when it shouldn't be or I'm doing something wrong. If
I'm doing something wrong I think this should be documented.
Mike Heath
---------------------------------------------------------------------------
Full Bug description available at: http://bugs.php.net/?id=7454