<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() 메서드는 계속 반복됩니다.