Передача данных с контроллера на View в приложении PHP MVC

Почти во всех учебниках или ответах на 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; 

Solutions Collecting From Web of "Передача данных с контроллера на View в приложении PHP MVC"

Логично логически группировать данные вида и отличать его от свойств класса внутреннего вида.

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> 

Я предполагаю, что причиной может быть просто «меньше набрав», но у него есть хорошие побочные эффекты:

  • Помогает, когда те, кто пишет шаблоны, не знакомы с php, и таким образом им не нужно беспокоиться о том, «что может означать этот $this-> ? ».
  • Наличие отдельного контейнера для переменных также помогает, когда есть некоторые свойства представления, которые должны быть приватными для этого класса, и библиотекаторы не хотят подвергать их шаблонам
  • Предотвращает конфликты имен с собственными свойствами представления и переменными для шаблонов.
  • Гораздо быстрее, чем схемы доступа на основе методов. Не может быть актуальным сейчас, как это было, когда, например, был создан smarty (также работал с php4).