Пакет CORE представляет базовые средства для реализации паттерна OBSERVER. Примеры использования этих средств см. в пакете ACTIVE_RECORD (Регистрация слушателей на объекты) и в пакете WEB_APP (см. класс lmbFormCommand)
В реализации Observer различают 2 роли:
За реализацию этих средств отвечает класс lmbDelegate. Класс lmbDelegate - это по сути объектная форма вызова метода какого-либо объекта.
Пример использования класса lmbDelegate для подписки на события класса lmbActiveRecord
$callback = new lmbDelegate($this, 'clearCache'); lmbActiveRecord :: registerGlobalOnAfterSaveCallback($callback); lmbActiveRecord :: registerGlobalOnAfterDestroyCallback($callback);
Здесь мы подписались методом clearCache какого-го объекта на события on_after_save и on_after_destroy класса lmbActiveRecord.
lmbDelegate может принимать различные параметры в конструктор:
$callback1 = new lmbDelegate($this, 'someMethod'); // метод объекта $callback2 = new lmbDelegate('someGlobalFunction'); // глобальная функция $callback3 = new lmbDelegate(array($this, 'someMethod')); // callback в виде массива $callback3 = new lmbDelegate('MyClass', 'someStaticMethod'); // статический метод класса
Также есть метод lmbDelegate :: objectify($callback), который автоматически распознает, пришел ли ему объект класса lmbDeledate или же один из вариантов, которые можно передать в конструктор.
Подписка на сообщения - это еще не все: необходимо предусмотреть средства оповещения слушателей. Для этого в классе lmbDelegate есть методы:
Например:
if(count($this->_listeners)) lmbDelegate :: invokeAll($this->_listeners, array($this));
Здесь для каждого случашате из $this→_listeners будет вызван соответствующий callback и в качестве параметра будет передан сам оповещающий объект ($this).
Обсуждение