html не распечатывает способ, которым я его ожидаю в источнике веб-страницы

Может ли кто-нибудь показать мне, сохраняя тот же уровень абстракции, как это сделать правильно? У меня есть два основных класса, которые не делают, как я хочу. Конечный результат должен быть:

<div class="test"> content </div> 

Если я сделаю это так:

 class Wrapper{ protected $_html = ''; public function open(){ $this->_html .= '<div class="test">'; } public function close(){ $this->_html .= '</div>'; } public function __toString(){ return $this->_html; } } class Content{ protected $hmtl .= ''; public function content(){ $wrapper = new Wrapper(); $wrapper->open(); $this->html .= 'test'; $wrapper->close(); } public function __toString(){ return $this->_html; } } 

$ content = new Content (); echo $ content-> content ();

Я получаю, и да, это от источника:

 "content"; 

Если я сделаю это так:

 class Wrapper{ protected $_html = ''; public function open(){ echo $this->_html .= '<div class="test">'; } public function close(){ echo $this->_html .= '</div>'; } // Technically don't need this public function __toString(){ return $this->_html; } } 

Я получаю, и да, это от источника,

 <div class="test"></div> "content" 

Так что я делаю неправильно? и как мне сохранить тот же уровень абстракции и получить желаемый результат?

Вы хотите, чтобы какой-то метод добавлял контент в обертку, например

 public function addContent($content){ $this->_html .= $content; } 

и вы можете это сделать

 $wrapper = new Wrapper(); $content = new Content(); $wrapper->open(); $wrapper->addContent((string)$content); $Wrapper->Close(); 

Вы никогда не вызываете метод Wrapper класса __toString который бы приводил к разметке HTML. Я думаю, что вы действительно хотите что-то вроде $this->_html = (string)$wrapper->open() чтобы он появился.

EDIT :

На самом деле, вся логика вашей установки ускользает от меня. Почему вы не return из методов -> open () и -> close () вместо этого?