Heim >Backend-Entwicklung >PHP-Tutorial >Designmuster – Ein Beispiel für Fragen zu PHP-Kompositionsmustern

Designmuster – Ein Beispiel für Fragen zu PHP-Kompositionsmustern

WBOY
WBOYOriginal
2016-08-04 09:22:26957Durchsuche

<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>

Die Ausgabe ist eine Endlosschleife
submenu1
|submenu1
|submenu1
...

Warum passiert das? Nach dem ersten rekursiven Aufruf von displayOperation() sollte foreach leer sein und dann anhalten. Warum gibt es eine Endlosschleife?

Antwortinhalt:

<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>

Die Ausgabe ist eine Endlosschleife
submenu1
|submenu1
|submenu1
...

Warum passiert das? Nach dem ersten rekursiven Aufruf von displayOperation() sollte foreach leer sein und dann anhalten. Warum gibt es eine Endlosschleife?

Implementierung hinzufügen $this->_items[$component->getName()] = $component;

Achtung$subMenu1->add($subMenu1);

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

Und dann geht es ewig weiter...

Das Klassenattribut $this->item ist immer das Objekt, das Sie instanziieren und übergeben, sodass die displayOperation()-Methode eine Schleife durchläuft

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn