Я всегда заканчиваю тем, что делаю это:
public function render($path, Array $data = array()){
return call_user_func(function() use($data){
extract($data, EXTR_SKIP);
ob_start();
include func_get_arg(0);
return ob_get_clean();
}, $path);
}
Обратите внимание на анонимную функцию и вызов func_get_arg()
; Я использую их для предотвращения передачи $this
и других переменных "загрязнение" в шаблон. Вы можете сбросить $data
перед включением тоже.
Если вы хотите, чтобы $this
было доступно, просто extract()
и include()
прямо из метода.
Так что вы можете:
$data = array('message' => 'hello world');
$html = $view->render('path/to/view.php', $data);
С path/to/view.php
:
<html>
<head></head>
<body>
<p><?php echo $message; ?></p>
</body>
</html>
Если вы хотите, чтобы объект View передавался, но не из области действия метода render()
, измените его следующим образом:
public function render($path, Array $data = array()){
return call_user_func(function($view) use($data){
extract($data, EXTR_SKIP);
ob_start();
include func_get_arg(1);
return ob_get_clean();
}, $this, $path);
}
$view
будет экземпляром объекта View. Он будет доступен в шаблоне, но будет отображать только открытые члены, так как он находится вне области действия метода render()
(, сохраняя инкапсуляцию закрытых / защищенных членов )