Может ли кто-нибудь показать мне, сохраняя тот же уровень абстракции, как это сделать правильно? У меня есть два основных класса, которые не делают, как я хочу. Конечный результат должен быть:
<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 () вместо этого?