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