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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-08-04 09:22:26
Original
998 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:
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
Aktuelle Ausgaben
PHP-Datenerfassung?
Aus 1970-01-01 08:00:00
0
0
0
PHP-Erweiterung intl
Aus 1970-01-01 08:00:00
0
0
0
Wie man PHP gut lernt
Aus 1970-01-01 08:00:00
0
0
0
Mehrere PHP-Versionen
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage