Добрый день,
В дополнение к решению от
@AMar4enko class Template {
private $callback = array();
private $name = 'dummy';
private $data = array();
private function doCallback() {
foreach (array_reverse($this->callback) as $func) {
call_user_func_array(array($this, $func[0]), $func[1]);
}
$this->callback = array();
}
// реализация вызываемых методов (вызываются только из doCallback)
private function _render($name) {
echo "Call Render<br>\r\n";
$this->name = $name;
}
private function _withData($data) {
echo "Call WithData<br>\r\n";
$this->data = $data;
}
// эти функции записываются в стек и видны извне
public function render($name) {
$this->callback[]=array('_'.__FUNCTION__, func_get_args());
return $this;
}
public function withData($data) {
$this->callback[]=array('_'.__FUNCTION__, func_get_args());
return $this;
}
// конечная функция которая вызовет функции из стека в обратном порядке
public function __toString() {
$this->doCallback();
echo "Show output<br>\r\n";
return "";
}
// конечная функция которая вызовет функции из стека в обратном порядке
public function compile() {
$this->doCallback();
echo "Show output<br>\r\n";
}
}
$tpl = new Template;
$tpl->render('templateName')->withData(array('a','b','c'));
echo $tpl->compile(); // или echo $tpl;
Наслаждайтесь :)