__toString Я использую в шаблонизаторе, ниже код, будет понятнее чем на словах
$layout = new Layout('Path/to/Tpl.html');
$form = $layout->createSection('/Path/to/Form.html'); // Регистрация подшаблона form.html
$form->assign('name', 'Sign In');
$layout->assignGlobal('FORM', $form);
$layout->assignGlobal('title', 'Sign In');
createSection создаст экземпляр класса SectionShell
<?php
namespace Architect\RenderSystem;
class SectionShell {
private $_layout;
private $_vars;
function __construct($path) {
$this->_layout = $path;
}
/**
* Public function: Assign local var
*
* Declaring a variable in the local namespace
* of the template vars
*
* @param string $name
* @param mixed $value
*/
public function assign($name, $value) {
$this->_vars[$name] = (is_object($value)) ? $value : new ValueShell($value);
}
public function assignMultiple($data) {
foreach($data as $key => $value) {
$this->assign($key, $value);
}
}
/**
* The conclusion to the template via a variable
*
* @return string
*/
function __toString() {
if(count($this->_vars) > 0) extract($this->_vars);
if(file_exists($this->_layout)) {
ob_start();
include_once $this->_layout;
$out = ob_get_contents();
ob_end_clean();
return $out;
}
}
}
Как видно, подшаблон формы компилируется при надобности вывести его в глобальный шаблон (<?=$FORM?>) Через метод __toString (пародия на ленивую загрузку). Мне кажется что это может считаться говнокодом (или нет?)! Стоит ли вместо toString использовать публичный метод, допустим display(); Тогда в шаблоне будет примерно следующее
<!DOCTYPE HTML>
<html>
<head><title><?=$title?></title></head>
<body>
<div class="form">
<?$FORM->display();?>
</div>
</body>
</html>