>백엔드 개발 >PHP 튜토리얼 >디자인 패턴 - PHP 구성 패턴 관련 질문의 예

디자인 패턴 - PHP 구성 패턴 관련 질문의 예

WBOY
WBOY원래의
2016-08-04 09:22:26960검색

<code><?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();</code>

출력이 무한 루프입니다
submenu1
|submenu1
|submenu1
...

이런 일이 발생하는 이유는 무엇입니까? displayOperation()에 대한 첫 번째 재귀 호출 후에는 foreach가 비어 있어야 하고 무한 루프가 발생하는 이유는 무엇입니까?

답글 내용:

<code><?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();</code>

출력이 무한 루프입니다
submenu1
|submenu1
|submenu1
...

이런 일이 발생하는 이유는 무엇입니까? displayOperation()에 대한 첫 번째 재귀 호출 후 foreach가 비어 있어야 하고 무한 루프가 발생하는 이유는 무엇입니까?

구현 추가 $this->_items[$component->getName()] = $component;

주목$subMenu1->add($subMenu1);

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

그리고 영원히 계속됩니다...

$this->item 클래스 속성은 항상 인스턴스화하고 전달하는 객체이므로 displayOperation() 메서드는 계속 반복됩니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.