Создание глобальной переменной не очень хорошая идея, когда вы используете шаблоны 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();
Таким образом, у вас нет глобальных переменных, и вы используете лучшие методы OO.
Однако, как отмечали другие, наличие одноэлементного представления не обязательно является хорошей идеей ... Вероятно, лучшим подходом было бы заставить ваш диспетчерский код создать новое представление и установить его для вызываемого контроллера, чтобы контроллер могиметь доступное представление и обращаться к нему напрямую.
Представление (не являющееся одноэлементным) также может быть общедоступным свойством или доступным через открытый метод одноэлементного приложения;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
), а все остальное загружается автоматически.