Многие фреймворки решили использовать этот подход: заставить пользователя расширять класс базового контроллера (если вы хотите создать новый контроллер) или расширять класс базовой модели (если вы хотите создать новую модель). ).
Давайте посмотрим на код базового класса контроллера CodeIgniter:
/**
* Constructor
*/
public function __construct()
{
self::$instance =& $this;
// Assign all the class objects that were instantiated by the
// bootstrap file (CodeIgniter.php) to local class variables
// so that CI can run as one big super object.
foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core');
$this->load->initialize();
log_message('debug', "Controller Class Initialized");
}
Что это делает? Ну, насколько я вижу, это просто позволяет нам использовать $this->load->...
например.
Давайте посмотрим на магический метод __get()
базового класса модели:
/**
* __get
*
* Allows models to access CI's loaded classes using the same
* syntax as controllers.
*
* @param string
* @access private
*/
function __get($key)
{
$CI =& get_instance();
return $CI->$key;
}
Он делает то же самое. Что теперь дает этот способ ведения дел?
PRO
- Вы можете получить доступ к полезным классам CI, набрав
$this->...
.
CONS
- Вы должны заставить пользователя расширять базовый класс
- Вы должны заставить пользователя вызвать
parent::__construct()
в конструкции класса
get_instace()
зарезервировано
$this->instance
переопределение вызывает фатальную ошибку
- Вы в основном повторили один и тот же код как в базовом классе Model, так и в базовом классе Controller
Теперь давайте рассмотрим другой подход:
Создайте статический класс, такой как App
, который выполняет все действия базового контроллера:
Например, $this->load->...
будет App::load->...
.
Теперь снова рассмотрим плюсы и минусы:
PRO
- Вы можете получить доступ к полезным классам CI
App::...
.
- Вы не должны заставить пользователя расширять базовый класс
- Вы не должны заставлять пользователя вызывать
parent::__construct()
в конструкции класса
- нет имя метода или имя свойства зарезервированы
- Вы можете использовать приложение как в модели, так и в контроллере
CONS
- У вас больше нет
$this->
сексуального синтаксиса ???
ВОПРОС
Здесь возникает реальный вопрос: будет ли второй подход лучше или хуже по сравнению с КИ? Почему?