Почти во всех учебниках или ответах на SO я вижу общий способ отправки данных с контроллера на представление, класс View часто выглядит примерно так же, как и код ниже:
class View { protected $_file; protected $_data = array(); public function __construct($file) { $this->_file = $file; } public function set($key, $value) { $this->_data[$key] = $value; } public function get($key) { return $this->_data[$key]; } public function output() { if (!file_exists($this->_file)) { throw new Exception("Template " . $this->_file . " doesn't exist."); } extract($this->_data); ob_start(); include($this->_file); $output = ob_get_contents(); ob_end_clean(); echo $output; } }
Я не понимаю, почему мне нужно поместить данные в массив, а затем вызвать extract ($ this -> _ data). Почему бы просто не поместить прямо какие-либо свойства в представление с контроллера, как
$this->_view->title = 'hello world';
то в моем макете или файле шаблона я мог бы просто сделать:
echo $this->title;
Логично логически группировать данные вида и отличать его от свойств класса внутреннего вида.
PHP позволит вам динамически назначать свойства, чтобы вы могли просто создать экземпляр класса View и присвоить свои данные в виде свойств. Лично я бы не рекомендовал этого. Что делать, если вы хотите перебирать данные просмотра или просто просто выгружать их для отладки?
Сохранение данных вида в массиве или содержащий объект dosn't означает, что вам нужно использовать $this->get('x')
для доступа к нему. Опция заключается в использовании перегрузки свойств PHP5, которая позволит вам хранить данные в виде массива, но иметь интерфейс $this->x
с данными из шаблона.
Пример:
class View { protected $_data = array(); ... ... public function __get($name) { if (array_key_exists($name, $this->_data)) { return $this->_data[$name]; } } }
Метод __get()
будет вызываться, если вы попытаетесь получить доступ к свойству, которое не существует. Итак, теперь вы можете:
$view = new View('home.php'); $view->set('title', 'Stackoverflow');
В шаблоне:
<title><?php echo $this->title; ?></title>
Я предполагаю, что причиной может быть просто «меньше набрав», но у него есть хорошие побочные эффекты:
$this->
? ».