Bug #1645: Nested objects in arrays don't work

From: Date: Thu, 01 Jul 1999 15:39:55 +0000
Subject: Bug #1645: Nested objects in arrays don't work
Groups: php.dev 
Request: Send a blank email to php-dev+get-7942@lists.php.net to get a copy of this message
From: johann.wezel@chkra.mail.abb.com Operating system: Linux 2.2.5 PHP version: 3.0.9 PHP Bug Type: Misbehaving function Bug description: Nested objects in arrays don't work PHP confuses something when I have a hierarchy of objects (an object having an array of objects which themselves have arrays of objects ...) and trying to walk down the structure. In the method invocation of the second level, the array holding the children pretends to be empty when it's not. Invoking the method of the object in question (in the second level) directly reveals that the array is not really empty; it works, although *only to the second level* again. I suspect that there is some static variable in the code which handles method calls. In the following code, the array of the "html" object seems to be empty in the printChildren method when it's called within the hierarchy. Calling the printOut method of this object directly (in the last line) lets it work again, but now the same error occurs in the "body" object one level lower. Strange enough, when I change the code to add the hierarchy bottom-up instead of top-down, then it works! <?php class _Base { var $attributes = array (); function _Base () { print "<pre>New base class</pre>\n"; } function set ($name, $value = "") { $attributes[$name] = $value; } function addTo ($container) { $container->addChild ($this); } } class _Container extends _Base { var $children = array (); function _Container () { print "<pre>New container</pre>\n"; } function add ($child) { $this->children[] = $child; //print "<pre>Added child to $this->tag: $child->tag. New count = ".count ($this->children)."</pre>\n"; } function printAttr () { reset ($this->attributes); while ($a = each ($this->attributes)) { print " $a[0]".!empty ($a[1])?"=\"$a[1]\"":""; } } function printChildren () { print "<pre>".count($this->children)." children ($this->children) of $this->tag:</pre>\n"; reset ($this->children); while (list ($k, $v) = each ($this->children)) { print "<pre>Printing child $k: $v->tag</pre>\n"; $v->printOut (); } } function printOut () { print "<pre>Printing $this->tag</pre>"; if (!empty ($this->tag)) { print "<$this->tag"; $this->printAttr (); print ">\n"; } $this->printChildren (); print "</$this->tag>\n"; print "<pre>Done printing $this->tag</pre>"; } } class Document extends _Container { function Document () { print "<pre>New document</pre>\n"; } } class Text extends _Base { var $tag; function Text ($text) { $this->tag = $text; } function printOut () { print $this->tag; } } class Html extends _Container { var $tag = "html"; function Html () { print "<pre>New Html</pre>\n"; } } class Body extends _Container { var $tag = "body"; function Body () { print "<pre>New Body</pre>\n"; } } $doc = new Document; $html = new Html; $doc->add ($html); $body = new Body; $html->add ($body); $t1 = new Text ("This is my text. "); $body->add ($t1); $t2 = new Text ("This is another text. "); $body->add ($t2); $doc->printOut (); $html->printOut (); ?>

« previous php.dev (#7942) next »