(навеянно gentoo)
Часто бывает ситуация, когда для работы класса нужно подгрузить другие классы или библиотеки. Обычно так и делаем: в конструкторе заргужаем и инициализируем если надо.
ИМХО, так не красиво. Получается засоряем конструктор. Хотя кому-как :)
Предлагаю свой метод "красивого"(для меня решения):
В базовом классе объявлем методы loadDependency() и initDependency(), а в конструкторе их вызываем.
(на примере моделей в codeIgniter-a)
[cc lang="php"]
class MY_Model extends Model {
[...]
public function __construct() {
parent::__construct();
$this->loadDependency();
$this->initDependency();
}
/**
* Загружает необходимые зависимости
* (модели, плагины, хелперы, и т.д)
* При необходимости, потомок перезагружает метод
*/
protected function loadDependency() { }
/**
* Инициализирует загруженные зависимости
* (модели, плагины, хэлперы, и т.д)
* При необходимости, потомок перезагружает метод
*/
protected function initDependency() { }
[...]
}
[/cc]
А в наследниках, если это нужно, загружаем зависимости и инициализируем их, перегружая эти методы:
[cc lang="php"]
class SomeModel extends MY_Model {
public function __construct() {
parent::__construct();
}
protected function loadDependency() {
parent::loadDependency();
$this->load->model('SomeModelAddon');
$this->load->helper('SomeModelHelper');
}
protected function initDependency() {
parent::initDependency();
$this->SomeModelAddon->someField = 'someVal';
}
}
[/cc]
Причём если целая иерархия наследований, то это заметно облегчает просмотр кода. Знаешь чётко где искать подгружаемый код и где он инициализируется.
В случае, если известно заранее что класс финальный(от него не будут наследоваться ничего) а в суперклассе методы пустые, можно убрать вызов методов у предка. И вообще аккуратно станет :)
Всё по полочкам.
"Просто железный порядок!" (с) Буринский А.А.