设计模式 - php组合模式的一个例子相关的问题
黄舟
黄舟 2017-04-11 09:03:09
[PHP讨论组]
<?php
abstract class MenuComponent
{
    abstract function add(MenuComponent $component);
    abstract function remove(MenuComponent $component);
    abstract function getName();
    abstract function displayOperation();

}

class MenuComposite extends MenuComponent
{
    private $_items = array(); 
    private $_name = null;

    function __construct($name)
    {
        $this->_name = $name;
    }

    function remove(MenuComponent $component){

    }

    function add(MenuComponent $component)
    {
        $this->_items[$component->getName()] = $component;
    }

    function getName(){
        return $this->_name;
    }

     public function displayOperation() {  
        static $align = '|';  

            $align .='';  
        
        echo $this->_name, " <br/>";  
        foreach($this->_items as $name=> $item) {  
            echo $align;  
            $item->displayOperation();  
        }  
    }  
}

class Client
{
    static function displayMenu()
    {
        $subMenu1 = new MenuComposite('submenu1');
        $subMenu1->add($subMenu1);
        $subMenu1->displayOperation();
    }
}

Client::displayMenu();

输出是无限循环的
submenu1
|submenu1
|submenu1
...

为什么会这样,第一次递归调用displayOperation()后foreach里面应该是空,就停止了,为什么会无限循环?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
迷茫

add 的实现 $this->_items[$component->getName()] = $component;

注意$subMenu1->add($subMenu1);

实例$subMenu1的属性$_items["submenu1"]是他自己本身 $subMenu1

然后无穷下去...

PHPz

类属性$this->item一直是你实例化传进去的对象,所以,这个displayOperation()方法就一直循环下去了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号