PHP hook, building hooks in your application
Introduction
One of the real challenges in building any type of framework, core or application is making it possible for the developers to hook into the business logic at specific points. Since PHP is not event based, nor it works with interrupts you have to come up an alternative.
The test case
Lets assume we are the main developers of a webshop framework. Programmers can use our framework to build complete webshops. Programmers can manage the orders that are placed on the webshop with the order class. The order class is part of our framework and we don’t want it to be extended by any programmer. However we don’t want to limit to programmers in their possibilities to hook into the orders process.
For example programmers should be able to send an email to the webshopowner if an order changes from one specific delivery status to another. This functionality is not part of the default behavior in our framework and is custom for the progammers webshop implementation.
Like said before, PHP doesn’t provide interrupts or real events so we need to come up with another way to implement hooks into our application. Lets take a look at the observer pattern.
Implementing the Observer pattern
The observer pattern is a design-pattern that describes a way for objects to be notified to specific state-changes in objects of the application.
For the first implementation we can use SPL. The SPL provides in two simple objects:
SPLSubject
- attach (new observer to attach)
- detach (existing observer to detach)
- notify (notify all observers)
SPLObserver
- update (Called from the subject (i.e. when it’s value has changed).
iOrderRef = $iOrderRef;
// Get order information from the database or an other resources
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param SplObserver $oObserver
* @return void
*/
public function attach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param SplObserver $oObserver
* @return void
*/
public function detach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notify()
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function delete()
{
$this->notify();
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notify();
// ...
$this->iStatus = $iStatus;
// ...
$this->notify();
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements SplObserver
{
/**
* Previous orderstatus
* @var int
*/
protected $iPreviousOrderStatus;
/**
* Current orderstatus
* @var int
*/
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oSubject
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(SplSubject $oSubject)
{
if(!$oSubject instanceof Order) {
return;
}
if(is_null($this->iPreviousOrderStatus)) {
$this->iPreviousOrderStatus = $oSubject->getStatus();
} else {
$this->iCurrentOrderStatus = $oSubject->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oSubject->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attach(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->delete();
?>
There are several problems with the implementation above. To most important disadvantage is that we have only one update method in our observer. In this update method we don’t know when and why we are getting notified, just that something happened. We should keep track of everything that happens in the subject. (Or use debug_backtrace… just joking, don’t even think about using it that way ever!).
Taking it a step further, events
Lets take a look at the next example, we will extend the Observer implementation with some an additional parameter for the eventname that occured.
Finishing up, optional data
iOrderRef = $iOrderRef;
// Get order information from the database or something else...
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function attachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function detachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notifyObserver($sEvent, $mData=null)
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this, $sEvent, $mData);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function add($aOrder = array())
{
$this->notifyObserver('onAdd');
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notifyObserver('onBeforeUpdateStatus');
// ...
$this->iStatus = $iStatus;
// ...
$this->notifyObserver('onAfterUpdateStatus');
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements Observer_Interface
{
protected $iPreviousOrderStatus;
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oObservable
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(Observable_Interface $oObservable, $sEvent, $mData=null)
{
if(!$oObservable instanceof Order) {
return;
}
switch($sEvent) {
case 'onBeforeUpdateStatus':
$this->iPreviousOrderStatus = $oObservable->getStatus();
return;
case 'onAfterUpdateStatus':
$this->iCurrentOrderStatus = $oObservable->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oObservable->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attachObserver(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->add();
?>
Now we are able to take action on different events that occur.
Disadvantages
Although this implementation works quite well there are some drawbacks. One of those drawbacks is that we need to dispatch an event in our framework, if we don’t programmers can’t hook into our application. Triggering events everywhere give us a small performance penalty however I do think this way of working gives the programmers a nice way to hook into your application on those spots that you want them to hook in.
Just for the record
Notice that this code is just an example and can still use some improvements, for example: each observer is initialized even it will maybe never be notified, therefore I suggest to make use of lazy in some cases for loading the objects. There are other systems to hook into an application, more to follow!
seo продвижение рейтинг [url=https://reiting-seo-kompanii.ru]seo продвижение рейтинг[/url] .
reiting seo kompanii_kdsn
21 Oct 25 at 5:11 pm
Je suis totalement enflamme par VBet Casino, ca degage une ambiance de jeu aussi ardente qu’une coulee de lave. Les options de jeu au casino sont riches et enflammees, offrant des sessions de casino en direct qui crepitent comme des flammes. Le service client du casino est une torche d’efficacite, assurant un support de casino immediat et incandescent. Les gains du casino arrivent a une vitesse eruptive, quand meme des bonus de casino plus frequents seraient brulants. Globalement, VBet Casino promet un divertissement de casino incandescent pour les volcanologues du casino ! Bonus le site du casino est une merveille graphique ardente, amplifie l’immersion totale dans le casino.
vbet poker грати|
fizzyglitterlemur9zef
21 Oct 25 at 5:11 pm
DAGA 88 Việt Nam – Cá cược minh bạch, nạp rút siêu tốc, ưu đãi VIP khủng.
Chơi ngay Thể thao, Casino, Slot đỉnh cao.
Đăng ký và nhận thưởng ngay hôm nay!
thanh toán 100%
21 Oct 25 at 5:13 pm
Как выбрать клинику для восстановления после запоя в владимире Если вы или ваши близкие столкнулись с проблемой запоя‚ важно знать‚ как правильно выбрать клинику для восстановления. В владимире доступны наркологические услуги‚ включая детоксикацию и лечение алкоголизма. нарколог на дом круглосуточно владимир Обратите внимание на наличие круглосуточного нарколога на дом; Это позволит получить медицинскую помощь на дому‚ что особенно удобно в кризисной ситуации. Кроме того‚ важно учитывать анонимность лечения‚ чтобы избежать стресса и stigma. При выборе клиники стоит уточнить‚ какие именно программы реабилитации доступны в данном учреждении. Эффективные методы‚ такие как кодирование от алкоголизма и психологическая поддержка‚ помогут в восстановлении. Также стоит помнить о роли поддержки семьи – она является ключевым фактором в успешном лечении зависимостей. Обращение за консультацией к наркологу поможет выбрать наиболее оптимальный план лечения для вашего случая. Выбор клиники в владимире – это серьезный шаг к здоровой жизни.
alkogolizmvladimirNeT
21 Oct 25 at 5:15 pm
Живые венки придают образу хрупкую свежесть: маттиола, эустома, розы и зелень создают естественный, фотогеничный контур. В «Флорион» венки собирают вручную, учитывая оттенок кожи и прическу, фиксируют легко и надежно. Подойдет для невест, утренников, этнических фестивалей. Посмотрите доступные варианты на https://www.florion.ru/catalog/venok-iz-zhivyh-cvetov — фото, цены, быстрая доставка по Москве. Симметрия или легкая асимметрия — выбор за вами, качество — за нами.
wegyklduh
21 Oct 25 at 5:15 pm
продвижение сайтов лидеры [url=https://seo-prodvizhenie-reiting.ru/]продвижение сайтов лидеры[/url] .
seo prodvijenie reiting_ofEa
21 Oct 25 at 5:16 pm
Ich finde absolut wild Lowen Play Casino, es verstromt eine Spielstimmung, die wie eine Savanne tobt. Die Auswahl im Casino ist ein echtes Raubtier, mit Casino-Spielen, die fur Kryptowahrungen optimiert sind. Der Casino-Service ist zuverlassig und machtig, mit Hilfe, die wie ein Brullen wirkt. Casino-Zahlungen sind sicher und reibungslos, aber die Casino-Angebote konnten gro?zugiger sein. Am Ende ist Lowen Play Casino ein Casino mit einem Spielspa?, der wie ein Brullen donnert fur Fans moderner Casino-Slots! Extra die Casino-Oberflache ist flussig und strahlt wie ein Sonnenaufgang, das Casino-Erlebnis total unbezahmbar macht.
lГ¶wen play burscheid rezensionen|
zappysquirrel3zef
21 Oct 25 at 5:16 pm
http://medtronik.ru/ сайт, где собраны инструкции по получению фрибетов и бонусов
Aaronawads
21 Oct 25 at 5:16 pm
Пользуюсь DRINKIO регулярно, всё стабильно на высоком уровне. Курьеры приезжают вовремя, доставка аккуратная. Ассортимент отличный, есть всё, что нужно. Удобно, что сервис работает круглосуточно. Всё без лишних хлопот. Доставка алкоголя на дом по Москве: https://drinkio105.ru/
Arthurtok
21 Oct 25 at 5:16 pm
какой фотоаппарат купить начинающему фотографу
Jamesmot
21 Oct 25 at 5:16 pm
как сфоткать звезды на айфон
Jamesmot
21 Oct 25 at 5:17 pm
It is not possible to become uncircumcised, as circumcision is a surgical procedure that removes
the foreskin from the penis.
penis enlargement with filler
21 Oct 25 at 5:17 pm
Нужен детский медицинский центр в Москве с психологической поддержкой? Посетите сайт Центра здоровья Юрия Титова — https://www.titov.center/ — это семейный центр здоровья, развития и социальной реабилитации детей и подростков. Ознакомьтесь с методиками, командой экспертов и списком диагнозов, по которым оказываем помощь. Мы предлагаем обширный набор индивидуальных программ реабилитации. Подробнее — на сайте.
ceferilBex
21 Oct 25 at 5:18 pm
привет !!! немогу с вами с вязатся отпишись!!!!
https://yasinovatayurm.ru
отзывы ждем
ErwinAroug
21 Oct 25 at 5:18 pm
номера телеграмм
NormanJaf
21 Oct 25 at 5:19 pm
сео продвижение заказать москва [url=http://reiting-seo-agentstv-moskvy.ru]http://reiting-seo-agentstv-moskvy.ru[/url] .
reiting seo agentstv moskvi_yqMl
21 Oct 25 at 5:19 pm
топ агентств россии [url=https://luchshie-digital-agencstva.ru]https://luchshie-digital-agencstva.ru[/url] .
lychshie digital agentstva_mloi
21 Oct 25 at 5:20 pm
протокол испытания
JosephDum
21 Oct 25 at 5:20 pm
Как купить Скорость в Оханске?Обратите внимание – https://crm-finance.ru
. Цены нормальные, доставка заявлена. Кто-то покупал у них? Как у них с надежностью?
Stevenref
21 Oct 25 at 5:20 pm
Клиентская поддержка Arkada Casino работает круглосуточно и готова помочь в решении любых
вопросов.
аркада казино вход
21 Oct 25 at 5:23 pm
best seo professional [url=http://www.top-10-seo-prodvizhenie.ru]best seo professional[/url] .
top 10 seo prodvijenie_zsKa
21 Oct 25 at 5:24 pm
https://www.twitch.tv/candetoxblend
Superar un test antidoping puede ser arriesgado. Por eso, existe una solucion cientifica desarrollada en Canada.
Su composicion potente combina creatina, lo que prepara tu organismo y oculta temporalmente los marcadores de sustancias. El resultado: una muestra limpia, lista para pasar cualquier control.
Lo mas valioso es su accion rapida en menos de 2 horas. A diferencia de metodos caseros, no promete limpiezas magicas, sino una herramienta puntual que funciona cuando lo necesitas.
Estos productos están diseñados para facilitar a los consumidores a depurar su cuerpo de sustancias no deseadas, especialmente aquellas relacionadas con el consumo de cannabis u otras drogas.
Uno buen detox para examen de pipí debe ofrecer resultados rápidos y visibles, en especial cuando el tiempo para desintoxicarse es limitado. En el mercado actual, hay muchas alternativas, pero no todas prometen un proceso seguro o rápido.
Qué funciona un producto detox? En términos básicos, estos suplementos operan acelerando la eliminación de metabolitos y residuos a través de la orina, reduciendo su presencia hasta quedar por debajo del umbral de detección de algunos tests. Algunos trabajan en cuestión de horas y su impacto puede durar entre 4 a cinco horas.
Es fundamental combinar estos productos con adecuada hidratación. Beber al menos dos litros de agua al día antes y después del uso del detox puede mejorar los resultados. Además, se sugiere evitar alimentos grasos y bebidas procesadas durante el proceso de preparación.
Los mejores productos de detox para orina incluyen ingredientes como extractos de hierbas, vitaminas del grupo B y minerales que favorecen el funcionamiento de los órganos y la función hepática. Entre las marcas más destacadas, se encuentran aquellas que presentan certificaciones sanitarias y estudios de eficacia.
Para usuarios frecuentes de cannabis, se recomienda usar detoxes con ventanas de acción largas o iniciar una preparación anticipada. Mientras más prolongada sea la abstinencia, mayor será la efectividad del producto. Por eso, combinar la planificación con el uso correcto del detox es clave.
Un error común es suponer que todos los detox actúan idéntico. Existen diferencias en contenido, sabor, método de ingesta y duración del efecto. Algunos vienen en formato líquido, otros en cápsulas, y varios combinan ambos.
Además, hay productos que agregan fases de preparación o limpieza previa al día del examen. Estos programas suelen sugerir abstinencia, buena alimentación y descanso adecuado.
Por último, es importante recalcar que ninguno detox garantiza 100% de éxito. Siempre hay variables biológicas como metabolismo, frecuencia de consumo, y tipo de examen. Por ello, es vital seguir ciertas instrucciones del fabricante y no relajarse.
Miles de estudiantes ya han comprobado su seguridad. Testimonios reales mencionan paquetes 100% confidenciales.
Si quieres proteger tu futuro, esta alternativa te ofrece seguridad.
JuniorShido
21 Oct 25 at 5:26 pm
как сделать красивые фото на море
Jamesmot
21 Oct 25 at 5:26 pm
Galera, resolvi compartilhar minha experiencia sobre o Bingoemcasa porque me surpreendeu demais. O site tem um clima acolhedor que lembra um salao cheio de energia. As salas de bingo sao cheias de energia, e ainda testei a roleta ao vivo, todos funcionaram redondinho. O atendimento no chat foi eficiente demais, o que ja me deixou bem a vontade. As retiradas foram eficientes de verdade, inclusive testei cartao e nao tive problema nenhum. Se pudesse apontar algo, diria que senti falta de ofertas extras, mas nada que estrague a experiencia. Na minha visao, o Bingoemcasa me conquistou. Ja me sinto parte da comunidade
bingoemcasa net com|
mysticotter71zef
21 Oct 25 at 5:28 pm
услуги по продвижению сайта в поисковых системах [url=https://www.reiting-runeta-seo.ru]услуги по продвижению сайта в поисковых системах[/url] .
reiting ryneta seo_tqma
21 Oct 25 at 5:28 pm
pin up ruletka [url=http://pinup5008.ru/]http://pinup5008.ru/[/url]
pin_up_uz_jxSt
21 Oct 25 at 5:28 pm
seo firma [url=www.seo-prodvizhenie-reiting.ru]seo firma[/url] .
seo prodvijenie reiting_liEa
21 Oct 25 at 5:30 pm
Декларация ТР ТС
JosephDum
21 Oct 25 at 5:30 pm
номера тг купить
NormanJaf
21 Oct 25 at 5:31 pm
лучшие seo компании [url=http://www.reiting-seo-kompanii.ru]http://www.reiting-seo-kompanii.ru[/url] .
reiting seo kompanii_fbsn
21 Oct 25 at 5:31 pm
Snagged some $MTAUR during stage 1; the price hike to next phase motivates quick action. Loving the hyper-casual vibe with blockchain perks. Early adopters win here.
mtaur token
WilliamPargy
21 Oct 25 at 5:32 pm
difference between Viagra and generic Sildenafil: difference between Viagra and generic Sildenafil – Cheap generic Viagra
WilliamUnjup
21 Oct 25 at 5:32 pm
I am curious to find out what blog platform you’re working with?
I’m experiencing some small security problems with my latest website and I would like to find something more
safeguarded. Do you have any solutions?
Dog hiking gear
21 Oct 25 at 5:32 pm
продвижение сайтов сео топ [url=https://www.reiting-kompanii-po-prodvizheniyu-sajtov.ru]продвижение сайтов сео топ[/url] .
agentstvo poiskovogo prodvijeniya_pfKt
21 Oct 25 at 5:33 pm
продвижение сайта в топ 10 москва [url=https://www.reiting-seo-agentstv-moskvy.ru]продвижение сайта в топ 10 москва[/url] .
reiting seo agentstv moskvi_kjMl
21 Oct 25 at 5:33 pm
купить диплом техникума в екатеринбурге [url=https://frei-diplom10.ru]купить диплом техникума в екатеринбурге[/url] .
Diplomi_otEa
21 Oct 25 at 5:34 pm
Требование должно быть выполнено до наступления дедлайна, указанного в правилах.
7к казино зеркало
21 Oct 25 at 5:34 pm
youronlinetoolbox – The design is clean and the advice feels genuine, not over-hyped.
Fern Duboise
21 Oct 25 at 5:34 pm
pin up hisobni bloklash [url=http://pinup5008.ru]http://pinup5008.ru[/url]
pin_up_uz_hsSt
21 Oct 25 at 5:35 pm
Стационар «Частного Медика 24» — условия, где пациент может спокойно пройти вывод из запоя без страха и дискомфорта.
Получить больше информации – [url=https://vyvod-iz-zapoya-v-stacionare-samara23.ru/]www.vyvod-iz-zapoya-v-stacionare-samara23.ru[/url]
Jerryrip
21 Oct 25 at 5:36 pm
how generic Viagra works in the body [url=https://bluepeakmeds.shop/#]how generic Viagra works in the body[/url] Sildenafil side effects and safe dosage
CharlesNeono
21 Oct 25 at 5:38 pm
seo agentura [url=reiting-kompanii-po-prodvizheniyu-sajtov.ru]reiting-kompanii-po-prodvizheniyu-sajtov.ru[/url] .
agentstvo poiskovogo prodvijeniya_wvKt
21 Oct 25 at 5:39 pm
Здравствуйте!
Хотите купить виртуальный номер телефона навсегда? Мы предоставляем постоянные виртуальные номера с широкими возможностями. Это надежный способ оставаться на связи в любой точке мира. Постоянный виртуальный номер для смс гарантирует удобство и простоту. Закажите свой виртуальный номер уже сегодня!
Полная информация по ссылке – https://chita-news.net/other/2025/06/10/215866.html
купить постоянный виртуальный номер, купить виртуальный номер для смс навсегда, постоянный виртуальный номер для смс
купить номер телефона навсегда, купить виртуальный номер навсегда, постоянный виртуальный номер для смс
Удачи и комфорта в общении!
Lynwoodassok
21 Oct 25 at 5:41 pm
licensed online pharmacy UK: BritMedsUk – NHS Viagra cost alternatives
AnthonySep
21 Oct 25 at 5:41 pm
компании занимающиеся продвижением сайтов [url=top-10-seo-prodvizhenie.ru]компании занимающиеся продвижением сайтов[/url] .
top 10 seo prodvijenie_cvKa
21 Oct 25 at 5:42 pm
Just grabbed some $MTAUR coins during the presale—feels like getting in on the ground floor of something huge. The audited smart contracts give me peace of mind, unlike sketchier projects. Can’t wait for the game beta to test those power-ups. minotaurus token
WilliamPargy
21 Oct 25 at 5:43 pm
seo group [url=https://seo-prodvizhenie-reiting.ru/]seo-prodvizhenie-reiting.ru[/url] .
seo prodvijenie reiting_zkEa
21 Oct 25 at 5:43 pm
купить номер для телеграмм
NormanJaf
21 Oct 25 at 5:44 pm
News.biz.ua — динамичная лента Украины с фокусом на бизнес, экономику, технологии и транспорт, дополненная оперативными сводками и спортом. Портал сочетает короткие новости и тематические разборы, чтобы быстро понять, что влияет на рынки и повседневность. Удобные рубрики, курсы валют и аккуратная верстка помогают читать с любого устройства. Откройте https://news.biz.ua/ — держите руку на пульсе решений Кабмина, корпоративных трендов и историй, которые меняют повестку дня.
liciwthsob
21 Oct 25 at 5:44 pm
pin up apk yuklab olish [url=http://pinup5008.ru]pin up apk yuklab olish[/url]
pin_up_uz_csSt
21 Oct 25 at 5:45 pm