Re: [PHP4BETA] What Happened to my object hierarchy ???

From: Date: Thu, 07 Oct 1999 13:08:34 +0000
Subject: Re: [PHP4BETA] What Happened to my object hierarchy ???
References: 1  Groups: php.version4 
Request: Send a blank email to php-version4+get-5284@lists.php.net to get a copy of this message
How recent is your cvs build? Please update it again and do a make clean before recompiling. Let us know if you still have the same problem. Any chance, of cutting down the problem a bit more? It's quite a lot of code. Thanks, Andi At 10:30 PM 10/7/99 +1100, Alan van den Bosch wrote:
Hi,
    Here is a curly one... I'm using  recent cvs DSO build of php4beta on rh6.0
and I noticed the problem about a week ago, but it has taken a while to track down. I have found that in certain circumstances the contents of arrays get mutilated for 'no apparent reason' (not that I can see anyways...). I have isolated the behaviour, check out the following (also attached) example code, around line 55. --------- <?php class part{
        function part($args=""){
                $this->properties=array();
                reset($args);
                while($cur=each($args)){
                        $this->prop($cur['key'],$cur['value']);
                }
        }
        function prop($var,$arg){
                if (!isset($arg)){
                        // single argument, return current value
                        return $this->properties[$var];
                }
                // set and return new value
                return $this->properties[$var]=$arg;
        }
        function show($indent=""){
                echo "${indent}Properties of ".$this->prop("name").":\n";
                $indent.="\t";
                reset($this->properties);
                while($cur=each($this->properties)){
                        //ignore index 'obj'
                        if ($cur['key']!="obj")echo "${indent}${cur['key']} = ${cur['value']} \n";
                }
        }
} class assembly extends part{
        function assembly($args="",$parts=""){
                // call base constructor
                $this->part($args);
                $this->properties['obj']=array();
                // add parts
                $this->add($parts);
        }
        function add(&$parts){
                reset($parts);
                while($cur=each($parts)){
                        if (is_object($cur['value'])){
// // uncomment only one of the following '$name=...' lines. // // this method of setting $name works
//                              $name=$cur['value']->properties["name"];
// // this method of setting $name kills the contents of $this->properties...
                                $name=$cur['value']->prop("name");
// $this->properties['obj'][$name]=$cur['value'];
                        }
                }
        }
        function show($indent=""){
                // list properties first
                part::show($indent);
                if (!is_array($this->properties['obj'])) return;
                // list member objects
                echo "${indent}member count is ".sizeof($this->properties['obj'])."\n";
                echo "${indent}Members of ".$this->prop("name").":\n";
                $indent.="\t";
                reset($this->properties['obj']);
                while($cur=each($this->properties['obj'])){
                        if (is_object($cur['value'])){
                                $cur['value']->show($indent);
                        }
                        else{
                                echo "\nshould be an object, value is '".$cur['value']."'\n";
                        }
                }
        }
} $door=new assembly(
        array(
                "name"=>"door",
                "colour"=>"green"
        ),
        array(
                new part(
                        array(
                                "name"=>"panel",
                                "material"=>"wood"
                        )
                ),
                new assembly(
                        array(
                                "name"=>"handle",
                                "type"=>"round"
                        ),
                        array(
                                new part(
                                        array(
                                                "name"=>"inside knob"
                                        )
                                ),
                                new part(
                                        array(
                                                "name"=>"outside knob"
                                        )
                                ),
                                new assembly(
                                        array(
                                                "name"=>"lock"
                                        ),
                                        array(
                                                new part(
                                                        array(
"name"=>"barrel"
                                                        )
                                                ),
                                                new part(
                                                        array(
"name"=>"bolt"
                                                        )
                                                )
                                        )
                                )
                        )
                ),
                new assembly(
                        array(
                                "name"=>"hindge",
                                "size"=>"medium"
                        ),
                        array(
                                new part(
                                        array(
                                                "name"=>"panel flap"
                                        )
                                ),
                                new part(
                                        array(
                                                "name"=>"frame flap"
                                        )
                                ),
                                new part(
                                        array(
                                                "name"=>"pin"
                                        )
                                )
                        )
                )
        )
); $door->show(); --------- Is it something I'm doing (if so, what ????), or is there a bug at work here ? Regards Alan van den Bosch Sanguis Pty Ltd. -- PHP 4 Beta
--- Andi Gutmans <andi@zend.com> http://www.zend.com/

« previous php.version4 (#5284) next »