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!
Love the new slot themes every month!
plinko demo
Tried a crypto casino, super convenient!
aviator game
Online casinos have the best game variety.
plinko
Got a weekly bonus, keeps me engaged.
juego de minas
Online casinos have better bonuses than expected.
vipzino
Won some cash on blackjack, so fun!
dragon tiger
Love the creative casino promotions!
jackpotraider
How to get 1xBet free promo code?
Sign up on their website using the 1xBet promo code and receive an impressive 120% bonus on your initial deposit, up to a maximum of ?33,000. For instance, if you deposit ?1,000, you’ll receive an additional ?1,200 in bonus funds, giving you a total of ?2,200 to kickstart your betting experience.
What is voucher code in 1xBet?
1xBet Promo Code Get 300% Bonus Up to GHS 3,445 in March 2025. Sign-up with 1xBet using the promo code. New customers can get a 200%, 250% or 300% bonus. The 1xBet promo code. Use it on the sign-up page to get a 300% bonus up to 3445 GHS.
1xbet Promo Code – Bonus (Valid In 2025)
1xbet multi code today Promo code for 1xBet, use this combination to increase your welcome bonus up to 100% on an amount reaching $/€130 for registration. These funds are available to all new players who have already created an account or are planning to do so. The bonus requires wagering, and it must be done in the sports section by placing bets with odds of at least 1.4 and a fivefold turnover. You have 30 days to use the code before it expires at the end of 2025.
1xBet Promo Code 2025 – this is a huge bonus of up to $1950 for the casino and 150 free spins on slots. An exclusive offer for new players aged 18 and above. To activate the code, you need to make a deposit of $10. The second and subsequent deposits must be at least $15. You can participate in this promotion until the end of 2025.
The 1xBet platform is one of the most popular in this domain. It has over a million fans worldwide and has earned players’ trust since 2007. Over time, the platform has evolved both in customer service and its interface.
1xBet always puts its clients first, listening to feedback and suggestions to improve the platform. It was one of the first bookmakers to create a mobile application, gaining even more popularity among players.
Online poker is so competitive and fun!
juego de minas
Love how easy it is to switch between games in online casinos.
jackpot raider bonus code
The live baccarat table is so classy!
plinko
Online casinos are perfect for quick sessions.
spinmama
The mobile casino site is super responsive.
plinko south africa
Online poker tournaments are so competitive!
mines game
Online casinos have clear game instructions.
jackpot raider bonus code
Love the sound effects in online slots, so cool!
betflare casino
Love the retro-themed slots, they’re so nostalgic!
додаток плінко
The live baccarat game feels so luxe!
andar bahar
The slot jackpots are always tempting!
jogo do touro
Online slots with bonus features are awesome.
dragon tiger
Transformez votre expérience de jeu avec Inventonslemondedapres, le comparateur qui
comprend vos besoins et préférences.
Won some money on slots, keeps me going!
vincispin codigo promocional
Online poker is so intense and fun!
minas demo
Online casinos have so many great games.
aviator game
Online slots with bonus features are awesome.
plinko game online
The live dealer blackjack table is awesome!
dragon tiger
The mobile casino site is super fast.
plinko demo
Online slots with bonus features are awesome.
juego de minas para ganar dinero
Online casinos have clear game guides.
mines
Online slots with high RTP are my go-to.
plinko game online
The slot game graphics are stunning!
spinmama
Online poker rooms are so thrilling!
aviator bet
Blackjack online is so much fun, especially with live dealers.
plinko demo
How to get 1xBet free promo code?
Sign up on their website using the 1xBet promo code and receive an impressive 120% bonus on your initial deposit, up to a maximum of ?33,000. For instance, if you deposit ?1,000, you’ll receive an additional ?1,200 in bonus funds, giving you a total of ?2,200 to kickstart your betting experience.
What is voucher code in 1xBet?
1xBet Promo Code Get 300% Bonus Up to GHS 3,445 in March 2025. Sign-up with 1xBet using the promo code. New customers can get a 200%, 250% or 300% bonus. The 1xBet promo code. Use it on the sign-up page to get a 300% bonus up to 3445 GHS.
1xbet Promo Code Offer Bonus Up To €/$130
1xBet Promo code for 1xBet, use this combination to increase your welcome bonus up to 100% on an amount reaching $/€130 for registration. These funds are available to all new players who have already created an account or are planning to do so. The bonus requires wagering, and it must be done in the sports section by placing bets with odds of at least 1.4 and a fivefold turnover. You have 30 days to use the code before it expires at the end of 2025.
1xBet Promo Code 2025 – this is a huge bonus of up to $1950 for the casino and 150 free spins on slots. An exclusive offer for new players aged 18 and above. To activate the code, you need to make a deposit of $10. The second and subsequent deposits must be at least $15. You can participate in this promotion until the end of 2025.
The 1xBet platform is one of the most popular in this domain. It has over a million fans worldwide and has earned players’ trust since 2007. Over time, the platform has evolved both in customer service and its interface.
1xBet always puts its clients first, listening to feedback and suggestions to improve the platform. It was one of the first bookmakers to create a mobile application, gaining even more popularity among players.
The refer-a-friend bonus got me extra spins!
mr pacho
Online casinos are great for casual gaming.
gransino
The slot jackpots keep me hooked!
aviator game
Online casinos are perfect for casual players.
jackpot raider
Got a cashback deal, really helpful.
plinko
Won some cash on roulette, love it!
mines game
Online casinos have awesome loyalty programs.
????
Online casinos make withdrawals so smooth.
mr pacho
Медики лгут. Лекарства Вас убивают. Я вылечу вас настоящей волновой медициной. Бигфарме конец
The mobile casino site is super fast.
plinko casino
Официальная наука вас обманывает. Я расскажу вам настоящую физику. БТГ, все секреты.
Love the immersive 3D slot games!
aviator game
Медики лгут. Лекарства Вас убивают. Я вылечу вас настоящей волновой медициной. Бигфарме конец
Live dealer games bring the casino home.
plinko
Love the soundtracks in online slots!
dragon vs tiger game tricks
El codigo de promocion de 1xBet le permite recibir hasta $130 en bono cuando realiza su primer deposito en 2025. 1xBet es una popular casa de apuestas en linea que ofrece una amplia seleccion de apuestas deportivas y juegos de azar. Para los nuevos usuarios, 1xbet ofrece un regalo de bienvenida especial en forma de codigo promocional. Los codigos promocionales son codigos especiales que le permiten obtener bonos adicionales al registrarse o realizar apuestas en el sitio.
Codigo promocional 1xbet: bono exclusivo hasta 130 €/$ – http://centroculturalrecoleta.org/blog/pages/?c_digo_promocional_165.html
Codigo promocional 1xBet 2025 Reclame su bono de bienvenida del 100% hasta €/$130. Todo lo que tiene que hacer es copiar el codigo promocional e ingresarlo durante el registro, activara todas las ofertas de bonificacion de 1xbet. Los codigos promocionales publicados en nuestro sitio web solo se pueden utilizar durante el registro, contribuyen a la recepcion de un bono para nuevos jugadores. Todos los codigos de bonificacion se proporcionan de forma gratuita.