Делать глобальную переменную не очень хорошая идея, если вы используете шаблоны MVC в проекте. Есть и другие решения, которые будут более разумно использовать ваш MVC.
Если вы должны иметь однократное использование ресурса, используйте одноэлементный шаблон а>. Что-то вроде
class My_View {
private $_instance;
static public function getInstance() {
if (null === self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
private function __construct() { }
public function __clone() {
trigger_error("Cannot make copy of this object", E_USER_ERROR);
}
// add public methods and/or properties here...
}
и получить этот объект просмотра в любом месте с помощью
$view = My_View::getInstance();
Таким образом, у вас нет глобальных переменных, и вы используете лучшие практики объектно-ориентированного программирования.
Однако, как указывали другие, наличие одноэлементного представления не обязательно является хорошей идеей... Вероятно, лучшим подходом было бы заставить ваш диспетчерский код создать новое представление и установить его для вызываемого контроллера, поэтому контроллер будет иметь доступный вид и доступ к нему напрямую.
Представление (не являющееся одноэлементным) также может быть общедоступным свойством или доступным через общедоступный метод одноэлементного приложения; My_Application::getInstance()->getView();
, который также может содержать текущую конфигурацию, пути,
Предлагаемое имя My_view
является просто примером. Использование некоторого соглашения об именах помогает организовать код и помогает избавиться от всех вызовов include/require в заголовках скриптов. Это не входит в сферу вашего вопроса, однако для ясности я кратко объясню:
В начальной загрузке вы объявляете свою функцию автозагрузки (как определено в руководство по PHP):
// My_Application.php located in /path/to/lib/My/Application.php
class My_View {
private $_instance;
static public function getInstance() {
if (null === self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
private $_basePath;
public $view;
private function __construct() { }
public function __clone() {
trigger_error("Cannot make copy of this object", E_USER_ERROR);
}
public function initAutoloader($base) {
$this->_basePath = $base;
spl_autoload_register(array($this, 'autoload'));
}
public function autoload($name) {
require $this->_basePath . str_replace('_', '/', $name) . '.php';
}
// get the application global view
public function getView() {
if (null === $this->view) {
$this->view = new My_View();
}
return $this->view;
}
}
// perhaps have the parameter being a constant. I.g. APP_BASE_PATH
My_Application::getInstance()->initAutoload('/path/to/lib/');
И просто включите файл '/path/to/lib/My/Application.php'
, и когда вы получите доступ к My_View
, функция load
будет вызвана с $name = 'My_View'
, и функция просто потребует от вас файл '/path/to/lib/My/View.php'
. Это немного для одного файла, но если все классы являются такими пространствами имен, вам нужен только один include (Autoloader
), а все остальное загружается автоматически.
person
Yanick Rochon
schedule
06.09.2010