Table of Contents |
---|
minLevel | 1 |
---|
maxLevel | 6 |
---|
outline | true |
---|
style | default |
---|
type | list |
---|
printable | true |
---|
|
kApplication - центральный класс системы
Объект этого класса создаётся одним из первых и содержит среди своих свойств ссылки на другие важные классы - Session, TemplateParser, kFactory, kHTTPQuery, kEventManager. Также, практически все прочие объекты имеют среди своих свойств ссылку на центральный объект приложения. Таким образом обеспечивается взаимодействие различных компонентов в системе.
Code Block |
---|
|
$event = new kEvent('custom-sections:OnAddListingLog');
$event->setEventParam('mode', LISTING_MODE_EXTERNAL);
$this->Application->HandleEvent($event); |
Пример иллюстрирует - благодаря тому, что центральный объект хранит ссылки на важнейшие объекты, практически из любого места системы можно вызвать любое событие.
В методе kApplication::HandleEvent обработка события делегируется объекту, ссылка на который находится в свойстве $this->Application->EventManager. По умолчанию это - объект класса kEventManager.
В свою очередь, для обработки события из метода kEventManager::HandleEvent опять же следуют обращения к методам центрального класса. Например, чтобы получить объект обработчика для конкретного указанного события, используется такая конструкция:
Code Block |
---|
|
$event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler');
/* @var $event_handler kEventHandler */
$event_handler->processEvent($event); |
То есть, вызывается метод kApplication::recallObject, получающий ссылку на необходимый обработчик событий путём обращения к другому базовому объекту, ссылка на который доступна в свойстве Factory.
Code Block |
---|
|
$result =& $this->Factory->getObject($name, $pseudo_class, $event_params); |
Если объект обработчика события ещё не создан, то объект класса kFactory его создаёт, и дополнительно, опять же - обращаясь к центральному объекту Application, получает и обрабатывает событие (так называемое Build Event), которое должно происходить при создании обработчика исходного события:
Code Block |
---|
|
$event =& $this->Application->EventManager->getBuildEvent($pseudo_class);
if($event)
{
$event->Init($prefix,$special);
foreach($event_params as $param_name=>$param_value)
{
$event->setEventParam($param_name,$param_value);
}
$this->Application->HandleEvent($event);
} |
Основные фазы работы приложения
Это инициализация, основная фаза и фаза завершения. Пример - из стандартного кода скрипта index.php:
Code Block |
---|
|
$application =& kApplication::Instance(); // получение ссылки на объект
$application->Init(); // инициализация
$application->Run(); // основная фаза
$application->Done(); // фаза завершения |
Фаза инициализации
Для того, чтобы использовать всю мощь, все возможности K4, надо вначале обеспечить инфраструктуру - создать все основные объекты, установить между ними связи, инициализировать эти объекты - то есть, произвести в них операции в соответствии с поступившими данными HTTP-запроса, текущими настройками WEB-сервера, значениями в базе данных и.т.п.
Подключение к базе данных и создание объекта для операций с базой данных
В kApplication::Init() для этого есть такой код:
Code Block |
---|
|
$this->Conn = new kDBConnection(SQL_TYPE, Array(&$this, 'handleSQLError') ); // создание объекта
$this->Conn->debugMode = $this->isDebugMode();
$this->Conn->Connect(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB); // подключение к базе данных проекта |
Подключение к базе данных осуществляется через объект класса kDBConnection. Ссылка на объект помещается в свойство Conn основного объекта приложения, в свою очередь, объект класса kDBConnection в своём конструктроре получает ссылку на основной объект приложения и сохраняет его в своём свойстве Application:
Code Block |
---|
|
$this->Application =& kApplication::Instance(); |
В классах, интенсивно использующих доступ к базе данных (например, в kDBBase и его наследниках kDBItem и kDBList), в целях повышения скорости, ссылка на объект для операций с базой данных хранится в отдельном свойстве Conn:
Code Block |
---|
|
function kDBBase()
{
parent::kBase();
$this->Conn =& $this->Application->GetADODBConnection();
} |
Таким образом, после инициализации, практически из любого метода имеется лёгкий доступ к базе данных:
Code Block |
---|
|
$all_tables = $this->Conn->Query('SHOW TABLES'); |
Создание объекта Factory и регистрация основных классов в нём
В kApplication::Init() для этого есть такой код:
Code Block |
---|
|
$this->Factory = new kFactory(); |
Объект Factory - один из основных объектов приложения. Его предназначение - учитывать какие объекты уже создавались, и, если запрашиваемый объект уже создавался - просто возвращать ссылку на него. Естественно, чтобы учитывать создание других объектов, объект класса kFactory создаётся раньше.
В K4 широко применяется принцип отложенной инициализации. Объекты как правило создаются только тогда, когда они становятся реально необходимы. Благодаря функциональности kFactory для соблюдения принципа отложенной инициализации требуется только одно - зарегистрировать классы, из которых могут впоследствии создаваться объекты. Регистрация класса это быстрая, требующая мало ресурсов операция, которая подразумевает запись в свойства-массивы объекта Factory таких данных как:
псевдоним класса
расположение файла с кодом класса
классы, которые должны быть определены прежде чем данный класс
Сразу же после создания объекта Factory регистрируются базовые классы - такие, которые необходимы для продолжения инициализации приложения, либо на более поздних фазах работы приложения.
Code Block |
---|
|
$this->RegisterDefaultClasses(); |
Название функции переводится с английского как "регистрировать классы по умолчанию". Это так называется потому, что любой зарегистрированный в Factory класс может оказаться подменённым на более поздних этапах инициализации в соответствии с конфигурацией конкретного приложения.