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!
obviously like your web site however you need to take a look at
the spelling on several of your posts. Many of them are rife with spelling problems and
I in finding it very bothersome to tell the truth nevertheless I
will surely come again again.
best drugs
22 Oct 25 at 5:07 am
лучший сервис по ремонту двигателей в москве [url=www.dzen.ru/a/aO5JcSrFuEYaWtpN/]www.dzen.ru/a/aO5JcSrFuEYaWtpN/[/url] .
Reiting avtoservisov po kapitalnomy remonty dvigatelei v Moskve_thsi
22 Oct 25 at 5:07 am
купить диплом проведенный [url=https://www.frei-diplom3.ru]купить диплом проведенный[/url] .
Diplomi_ljKt
22 Oct 25 at 5:07 am
В Екатеринбурге «Похмельная Служба» выезжает к пациенту домой и проводит детоксикацию прямо на месте.
Подробнее тут – [url=https://vyvod-iz-zapoya-ekaterinburg25.ru/]нарколог на дом вывод из запоя в екатеринбурге[/url]
RodneyAnivy
22 Oct 25 at 5:08 am
продвижение сайтов по россии [url=https://reiting-seo-agentstv.ru/]reiting-seo-agentstv.ru[/url] .
reiting seo agentstv_pisa
22 Oct 25 at 5:10 am
кракен сайт
кракен онлайн
JamesDaync
22 Oct 25 at 5:10 am
Medi Vertraut: Medi Vertraut – Sildenafil Wirkung und Dosierung
AnthonySep
22 Oct 25 at 5:11 am
лучшее сео продвижение [url=http://reiting-seo-agentstv.ru/]http://reiting-seo-agentstv.ru/[/url] .
reiting seo agentstv_ucsa
22 Oct 25 at 5:12 am
seo раскрутка недорого [url=www.reiting-runeta-seo.ru]seo раскрутка недорого[/url] .
reiting ryneta seo_brma
22 Oct 25 at 5:13 am
юридический перевод на английский [url=https://www.teletype.in/@alexd78/HN462R01hzy]https://www.teletype.in/@alexd78/HN462R01hzy[/url] .
Vidi perevodov v buro Perevod i Pravo_nlst
22 Oct 25 at 5:14 am
seo агентства рекламные москва [url=http://reiting-kompanii-po-prodvizheniyu-sajtov.ru]http://reiting-kompanii-po-prodvizheniyu-sajtov.ru[/url] .
agentstvo poiskovogo prodvijeniya_dpKt
22 Oct 25 at 5:14 am
Если вы ищете надежную клинику для вывода из запоя, обратитесь в «Детокс» в Краснодаре. Услуга вызова нарколога на дом доступна круглосуточно. Врачи приедут к вам в течение 1–2 часов и окажут необходимую помощь.
Получить дополнительную информацию – [url=https://narkolog-na-dom-krasnodar28.ru/]нарколог на дом клиника краснодар[/url]
StephenTuple
22 Oct 25 at 5:14 am
диплом кулинарного техникума купить [url=https://frei-diplom9.ru]диплом кулинарного техникума купить[/url] .
Diplomi_onea
22 Oct 25 at 5:15 am
купить диплом с занесением в реестр [url=http://frei-diplom3.ru/]купить диплом с занесением в реестр[/url] .
Diplomi_atKt
22 Oct 25 at 5:15 am
Как купить МДМА в Галиче?Люди, помогите с выбором – присмотрел https://mahw.ru
. Цены нормальные, доставку обещают. Кто-нибудь знаком с ними? Как работают?
Stevenref
22 Oct 25 at 5:16 am
купить диплом россия [url=http://www.rudik-diplom5.ru]купить диплом россия[/url] .
Diplomi_rrma
22 Oct 25 at 5:16 am
seo продвижение сайта заказать в москве [url=https://seo-prodvizhenie-reiting-kompanij.ru/]seo продвижение сайта заказать в москве[/url] .
seo prodvijenie reiting kompanii_kkst
22 Oct 25 at 5:17 am
Если вы ищете надежную клинику для вывода из запоя, обратитесь в «Детокс» в Краснодаре. Услуга вызова нарколога на дом доступна круглосуточно. Врачи приедут к вам в течение 1–2 часов и окажут необходимую помощь.
Подробнее тут – [url=https://narkolog-na-dom-krasnodar26.ru/]выезд нарколога на дом краснодар[/url]
RolandNigax
22 Oct 25 at 5:19 am
На удивление был поражен скоростью работы магазина. Все четко как в аптеке))) Благодарствую
https://makeevkadj.ru
вобщем решение принято заказ буду делать ТУТ!!!!
Donaldmoire
22 Oct 25 at 5:19 am
seo professional services [url=top-10-seo-prodvizhenie.ru]top-10-seo-prodvizhenie.ru[/url] .
top 10 seo prodvijenie_txKa
22 Oct 25 at 5:19 am
kraken ios
кракен тор
JamesDaync
22 Oct 25 at 5:19 am
купить диплом с занесением в реестр в мурманске [url=https://frei-diplom2.ru/]купить диплом с занесением в реестр в мурманске[/url] .
Diplomi_dsEa
22 Oct 25 at 5:21 am
купить диплом техникума в смоленске [url=https://www.frei-diplom8.ru]купить диплом техникума в смоленске[/url] .
Diplomi_insr
22 Oct 25 at 5:21 am
Le code promo est supprime : entrez-le dans le champ « Code promo » et reclamez un bonus de bienvenue de 100% jusqu’a 130€, pour vos paris sportifs. Inscrivez-vous sur 1xBet ou via l’application mobile. Apres votre premier depot, vous activerez le code bonus. L’offre est valable pour toute l’annee 2026, et le bonus doit etre mise dans les 30 jours. Vous pouvez trouver le code promo sur ce lien — https://www.freie-waehler-werdau.de/wp-content/pgs/le-code-promo-1xbet_bonus.html.
Marvinspaft
22 Oct 25 at 5:22 am
https://www.tumblr.com/blog/candetoxblend
Pasar una prueba de orina puede ser complicado. Por eso, se ha creado una formula avanzada probada en laboratorios.
Su receta precisa combina minerales, lo que sobrecarga tu organismo y disimula temporalmente los marcadores de toxinas. El resultado: una orina con parametros normales, lista para entregar tranquilidad.
Lo mas destacado es su accion rapida en menos de 2 horas. A diferencia de otros productos, no promete limpiezas magicas, sino una herramienta puntual que responde en el momento justo.
Estos suplementos están diseñados para facilitar a los consumidores a purgar su cuerpo de componentes no deseadas, especialmente las relacionadas con el consumo de cannabis u otras sustancias.
Un buen detox para examen de pipí debe brindar resultados rápidos y visibles, en particular cuando el tiempo para prepararse es limitado. En el mercado actual, hay muchas alternativas, pero no todas aseguran un proceso seguro o efectivo.
De qué funciona un producto detox? En términos básicos, estos suplementos operan acelerando la depuración de metabolitos y residuos a través de la orina, reduciendo su presencia hasta quedar por debajo del nivel de detección de algunos tests. Algunos trabajan en cuestión de horas y su acción puede durar entre 4 a 6 horas.
Resulta fundamental combinar estos productos con correcta hidratación. Beber al menos par litros de agua al día antes y después del uso del detox puede mejorar los beneficios. Además, se aconseja evitar alimentos pesados y bebidas azucaradas durante el proceso de preparación.
Los mejores productos de detox para orina incluyen ingredientes como extractos de plantas, vitaminas del complejo B y minerales que favorecen el funcionamiento de los riñones y la función hepática. Entre las marcas más vendidas, se encuentran aquellas que presentan certificaciones sanitarias y estudios de eficacia.
Para usuarios frecuentes de THC, se recomienda usar detoxes con tiempos de acción largas o iniciar una preparación temprana. Mientras más larga sea la abstinencia, mayor será la efectividad del producto. Por eso, combinar la organización con el uso correcto del suplemento es clave.
Un error común es creer que todos los detox actúan igual. Existen diferencias en contenido, sabor, método de toma y duración del impacto. Algunos vienen en formato líquido, otros en cápsulas, y varios combinan ambos.
Además, hay productos que incorporan fases de preparación o limpieza previa al día del examen. Estos programas suelen sugerir abstinencia, buena alimentación y descanso recomendado.
Por último, es importante recalcar que ninguno detox garantiza 100% de éxito. Siempre hay variables individuales como metabolismo, frecuencia de consumo, y tipo de examen. Por ello, es vital seguir todas instrucciones del fabricante y no relajarse.
Miles de personas en Chile ya han validado su efectividad. Testimonios reales mencionan paquetes 100% confidenciales.
Si necesitas asegurar tu resultado, esta alternativa te ofrece seguridad.
JuniorShido
22 Oct 25 at 5:22 am
лучшее сео продвижение [url=reiting-seo-agentstv.ru]reiting-seo-agentstv.ru[/url] .
reiting seo agentstv_cpsa
22 Oct 25 at 5:25 am
технический перевод требования [url=dzen.ru/a/aPFFa3ZMdGVq1wVQ]dzen.ru/a/aPFFa3ZMdGVq1wVQ[/url] .
Tehnicheskii perevod_jtml
22 Oct 25 at 5:25 am
https://sarabantohora.substack.com/p/codigo-promocional-1xbet-bono-1950
JamesMUb
22 Oct 25 at 5:27 am
купить диплом москва легально [url=http://frei-diplom2.ru]http://frei-diplom2.ru[/url] .
Diplomi_xgEa
22 Oct 25 at 5:28 am
Мне очень жаль, ничем не могу Вам помочь. Я думаю, Вы найдёте верное решение.
После скачивания файла, запустите его и следуйте инструкциям в окошке, [url=https://sunsoftitsolutions.com/skachat-melbet-na-android-obzor-prilozheniya/]https://sunsoftitsolutions.com/skachat-melbet-na-android-obzor-prilozheniya/[/url] чтобы выявить приложение на ваш пк. Откройте апстор на имеющемся девайсе и введите в используя специальную строку поиска запрос «Мелбет».
Ryanrurdy
22 Oct 25 at 5:28 am
купить диплом техникума образца 1977 года [url=http://www.frei-diplom8.ru]купить диплом техникума образца 1977 года[/url] .
Diplomi_fvsr
22 Oct 25 at 5:29 am
сео продвижение сайтов топ [url=reiting-kompanii-po-prodvizheniyu-sajtov.ru]reiting-kompanii-po-prodvizheniyu-sajtov.ru[/url] .
agentstvo poiskovogo prodvijeniya_gmKt
22 Oct 25 at 5:29 am
official Wisebusiness blog
PHP hook, building hooks in your application – Sjoerd Maessen blog at Sjoerd Maessen blog
official Wisebusiness blog
22 Oct 25 at 5:29 am
кухни спб на заказ [url=http://kuhni-spb-2.ru]http://kuhni-spb-2.ru[/url] .
kyhni spb_wymn
22 Oct 25 at 5:30 am
кракен маркетплейс
kraken client
JamesDaync
22 Oct 25 at 5:31 am
диплом купить реестр [url=http://frei-diplom2.ru/]диплом купить реестр[/url] .
Diplomi_nqEa
22 Oct 25 at 5:32 am
купить диплом педагога [url=http://rudik-diplom12.ru]купить диплом педагога[/url] .
Diplomi_uoPi
22 Oct 25 at 5:32 am
Avoid mess around lah, elite institutions organize presentations Ƅy experts, motivating ʏⲟur
kid toԝards ambitious job goals.
Listen up, Singapore structure rewards initial wins, ɡood primary cultivates habits
foг O-Level achievements ɑnd prestigious careers.
Wah lao, no matter іf institution proves atas, mathematics serves ɑѕ tһe decisive
subject іn cultivates poise іn numbers.
Listen up, calm pom ⲣi ρi, arithmetic is one fгom the һighest disciplines in primary school, laying
foundation to Ꭺ-Level advanced math.
Oi oi, Singapore parents, mathematics proves ⅼikely the most impߋrtant primary subject, fostering innovation for challenge-tackling fⲟr
creative professions.
Βesides to school amenities, foicus ᥙpon mathematics tօ stop typical errors
ѕuch as careless errors аt assessments.
Hey hey, composed pom рi pi, math remaіns ᧐ne in the hіghest subjects іn primary school, establishing
groundwork fߋr A-Level һigher calculations.
Ꮪi Ling Primary School offers a favorable setting fοr detailed development.
Ꭲhe school inspires self-confidence tһrough quality guideline.
Hong Ꮤen School cultivates Chinese culture alongside modern-Ԁay education.
Multilingual programs construct strong structures.
Ӏt’s perfect for heritage conservation.
Ꮋere is my website: Singapore Chinese Girls’ School
Singapore Chinese Girls' School
22 Oct 25 at 5:32 am
купить диплом в ессентуках [url=http://rudik-diplom5.ru]купить диплом в ессентуках[/url] .
Diplomi_soma
22 Oct 25 at 5:33 am
about me seo [url=www.top-10-seo-prodvizhenie.ru/]www.top-10-seo-prodvizhenie.ru/[/url] .
top 10 seo prodvijenie_ewKa
22 Oct 25 at 5:33 am
купить диплом техникума в абакане [url=http://frei-diplom8.ru/]купить диплом техникума в абакане[/url] .
Diplomi_ezsr
22 Oct 25 at 5:34 am
В этой статье вы найдете уникальные исторические пересечения с научными открытиями. Каждый абзац — это шаг к пониманию того, как наука и события прошлого создают основу для технологического будущего.
Изучить материалы по теме – https://www.kormentdot.com/il-salto-di-mister-okay
Carrollimmew
22 Oct 25 at 5:34 am
где можно купить диплом техникума в красноярске [url=https://frei-diplom9.ru/]где можно купить диплом техникума в красноярске[/url] .
Diplomi_gyea
22 Oct 25 at 5:36 am
Сервис Stop-Alko предлагает помощь при запое на дому в Екатеринбурге. Услуга доступна 24/7.
Получить дополнительные сведения – [url=https://vyvod-iz-zapoya-ekaterinburg26.ru/]вывод из запоя недорого в екатеринбурге[/url]
Williamner
22 Oct 25 at 5:37 am
seo рейтинг [url=https://reiting-seo-agentstv.ru/]reiting-seo-agentstv.ru[/url] .
reiting seo agentstv_nbsa
22 Oct 25 at 5:38 am
купить диплом в нижнекамске [url=https://rudik-diplom5.ru/]https://rudik-diplom5.ru/[/url] .
Diplomi_mtma
22 Oct 25 at 5:38 am
shopandshineeveryday.shop – Great variety of items, found exactly what I needed quickly.
Leola Minas
22 Oct 25 at 5:39 am
kraken ios
кракен ссылка
JamesDaync
22 Oct 25 at 5:39 am
оптимизация сайта под продвижение [url=https://www.reiting-runeta-seo.ru]оптимизация сайта под продвижение[/url] .
reiting ryneta seo_xbma
22 Oct 25 at 5:39 am
диплом техникума купить в украине [url=www.frei-diplom9.ru/]диплом техникума купить в украине[/url] .
Diplomi_uwea
22 Oct 25 at 5:41 am