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

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

WBOY
Freigeben: 2016-08-04 09:22:26
Original
966 Leute haben es durchsucht

<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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage