#10088 [Com]: Object linking
| From: | nude-preteen1561 at hotmail dot com | Date: | Tue, 20 Jul 2004 14:59:24 +0000 |
| Subject: | #10088 [Com]: Object linking | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-62743@lists.php.net to get a copy of this message | ||
ID: 10088
Comment by: nude-preteen1561 at hotmail dot com
Reported By: admin at room41 dot net
Status: Closed
Bug Type: Class/Object related
Operating System: W2K
PHP Version: 4.0.4pl1
New Comment:
<a href=http://cold-heels-warez-tv.da.ru>preteen
nude</a>
Previous Comments:
------------------------------------------------------------------------
[2001-11-17 12:46:18] mfischer@php.net
Your example is wrong. You're copying object everywhere like it is
christmas day.
Here's the corrected example for your convenience:
<?
$d1 = &new obj("one"); // Suppress the warning over the missing
argument
$d2 = &new obj("two", $d1);
$d3 = &new obj("three", $d2);
$d4 = &new obj("four", $d3);
$d5 = &new obj("five", $d4);
// Dump what should be the entire linked list
$d1->dump();
print("\n\n");
// Now to demonstrate the problem:
// No matter where you begin the dump() from, only the
// $this node and its immediate successor are printed.
$d2->dump(); print("\n\n");
$d3->dump(); print("\n\n");
class obj {
var $next;
var $name;
function &obj($name,&$prev) {
// Add each new object as the "next" pointer of the preceeding one
$this->name = $name;
if ($prev) $prev->next = &$this;
}
function dump() {
for ( $ptr = &$this; $ptr; $ptr = &$ptr->next) print($ptr->name .
"\n");
}
}
?>
Even if this example uses '&' where not needed it's good that way
because not even a single object gets copied by accident.
Closed.
------------------------------------------------------------------------
[2001-03-31 04:58:18] admin at room41 dot net
The script shown attempts to implement a linked list, but the problem
is more general and occurs in many similar situations.
<?
$d1 = @new obj("one"); // Suppress the warning over the missing
argument
$d2 = new obj("two", $d1);
$d3 = new obj("three", $d2);
$d4 = new obj("four", $d3);
$d5 = new obj("five", $d4);
// Dump what should be the entire linked list
$d1->dump();
print("<p>");
// Now to demonstrate the problem:
// No matter where you begin the dump() from, only the
// $this node and its immediate successor are printed.
$d2->dump(); print("<p>");
$d3->dump(); print("<p>");
class obj {
var $next;
var $name;
function &obj($name,&$prev) {
// Add each new object as the "next" pointer of the preceeding one
this->name = $name;
if ($prev) $prev->next = $this;
}
function dump() {
for ( $ptr = $this; $ptr; $ptr = $ptr->next) print($ptr->name .
"<br>");
}
}
?>
It seems that when an object's data is manipulated by a different
object - even as here, of the same class - the changes made to the
object are lost when its context expires.
Configuration: Absolutely standard
Webserver: Apache and IIS ... same problem in both, and under cgi and
as a module
Aggravation factor: Immense
Cheer chaps for an otherwise excellent language!
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=10088&edit=1