TEventClass - описание класса
10.02.2009Следующим в иерархии классов блоголёта после TDataClass является TEventClass, который реализует механизм событий в блоголёте. Это очень важный класс - именно от него и TItems порождены практически все классы блоголёта. Если TDataClass реализует сохранение и восстановление данных объекта, то TEventClass управляет всеми событиями. Рассмотрим подробнее, что такое событие, как добавить событие, и как подписаться на событие.
Событие - это метод класса, который может быть вызван в любом месте, например в TPosts (класс для управления записями) это события Added, Edited, Deleted, Changed - которые вызываются в конце соответствующих методов и означают, что запись была только что создана, отредактирована или удалена. Если вы хотите, чтобы ваш класс реагировал на эти события, то необходимо подписаться на них. Делается это очень просто
$posts = &TPosts::Instance();
$posts->Added = $this->PostAdded;
Где PostAdded - это метод вашего класса следующего вида:
public function PostAdded($postid)
и теперь, когда будет создана новая запись в блоге, то будет создан экземпляр вашего класса и вызван метод PostAdded, в котором вы можете реагировать нужным вам способом. Описание событий для каждого класса находятся в описании класса.
Помимо подписки на события необходима симметричная операция - отписка от события. В классе TEventClass для этого есть несколько методов:
- public function UnsubscribeEvent($EventName, $ClassName) - отписывает одно событие от одного класса, оба параметра строки
- public function UnsubscribeClass(&$obj) - отписывает объект от всех событий, на которые был подписан класс, экземпляром которого является объект
- public function UnsubscribeClassName($class) - отписывает класс, параметр строка - название класса, обычно берется из get_class($this)
Чтобы добавить событие в свой класс необходимо в методе CreateData вызвать AddEvents со списком добавляемых событий. Пример из класса TItems (базовый класс для управления элементами):
protected function CreateData() {
parent::CreateData();
$this->AddEvents('Added', 'Deleted');
$this->AddDataMap('items', array());
$this->AddDataMap('lastid', 0);
}
Теперь в классе TItems есть два события Added и Deleted на которые может подписаться любой объект. Список событий наследуется и в потомке от TItems классе TPosts будут уже эти два события, и их добавлять в TEventclass не следует.
В методе CreateData вы также заметили вызов методов AddDataMap - это специальный метод для связывания элементов массива Data, о котором рассказано в TDataClass, со свойствами класса. Если свойство простое, например это строка или число, то такого связывания как правило не нужно, но если таким элементом является массив, то при обращению к нему может сказаться самым фатальным образом для системы - будет пожрано много памяти. Чтобы этого не происходило можно связать объявленные свойства с элементами массива Data. В классе TItems таким образом связывается items, вызов AdddDataMap в этом случае аналогичен следующему коду:
$this->items = &$this->Data['items'];
Но чтобы эта связь не терялась после каждого восстановления данных из файла, необходимо производить связывание через метод AddDataMap, который добавляет в пару "название свойства" и "ключ массива Data" в специальный массив. Это гарантирует всегда одни и теже данные в обоих случаях.
Помимо управления событиями TEventClass делает еще следующее: в конструкторе инициализирует данные (метод CreateData) и загружает данные (Load - метод класса TDataClass). В результате после создания потомка от TEventClass мы имеем уже готовый к употреблению объект, данные которого были уже восстановлены из соответствующего файла. Например для TPosts это будет список записей.
Комментариев нет на запись “TEventClass - описание класса”
Оставить комментарий