Wanneer casino weer open South Holland

  1. Roulette Wiel: Wed liefde om u een mooie gemakkelijke manier om een overwinning te garanderen wanneer u klikt om te draaien.
  2. Gratis Casino I Mobilen - Rekening houdend met alles, heeft dit Grosvenor beoordeling denk dat deze operator heeft het recht om zichzelf te labelen als de meest populaire casino in het Verenigd Koninkrijk.
  3. Wat Heb Je Nodig Om Bingo Te Spelen: Jagen prooi groter dan zichzelf, terwijl heimelijk negeren van hun vijand early warning systeem is slechts een van de vele coole combinaties in het spel.

Winkans bij loterijen

Wild Spells Online Gokkast Spelen Gratis En Met Geld
We hebben deze download online casino's door middel van een strenge beoordeling proces om ervoor te zorgen dat u het meeste uit uw inzetten wanneer u wint.
Nieuwe Gokkasten Gratis
Dit betekent dat het hangt af van wat inkomstenbelasting bracket je in, en of de winst zal duwen u in een andere bracket.
The delight is de geanimeerde banner met de welkomstpromotie bij de eerste duik je in.

Pokersites voor Enschedeers

Nieuw Casino
De reel set is 7x7, met een totaal van 49 symbolen in het spel.
Casigo Casino 100 Free Spins
Holland Casino Eindhoven is een vestiging waar veel georganiseerd op het gebied van entertainment..
Casino Spel Gratis Slots

Sjoerd Maessen blog

PHP and webdevelopment

PHP hook, building hooks in your application

with 107,020 comments

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!

Written by Sjoerd Maessen

May 23rd, 2011 at 8:02 pm

Posted in API

Tagged with , , ,

107,020 Responses to 'PHP hook, building hooks in your application'

Subscribe to comments with RSS or TrackBack to 'PHP hook, building hooks in your application'.

  1. The main thing is here: https://totalfratmove.com

    MichaelfroDo

    24 Oct 25 at 4:57 pm

  2. The whole summary for you: https://www.leristrutturazioni.it

    BrianTance

    24 Oct 25 at 4:57 pm

  3. Как купить Меф в Гаврилов-Яме?Обратите внимание – https://sameng.ru
    . Цены нормальные, доставку обещают. Кто-то покупал у них? Как с качеством?

    Stevenref

    24 Oct 25 at 4:57 pm

  4. 1xbet spor bahislerinin adresi [url=https://www.1xbet-giris-3.com]https://www.1xbet-giris-3.com[/url] .

    1xbet giris_paMi

    24 Oct 25 at 4:58 pm

  5. Alas, withoᥙt strong mathematics іn Junior College, no matter tоp establishment youngsters
    ccould stumble аt secondary calculations, tһerefore build іt now leh.

    River Valley High School Junior College integrates bilingualism
    ɑnd environmental stewardship, developing eco-conscious
    leaders ᴡith global poіnt оf views. State-οf-the-art labs
    and green initiatives support cutting-edge knowing іn sciences аnd humanities.
    Trainees pardticipate іn cultural immersions аnd service projects, enhancing
    empathy аnd skills. The school’s unified neighborhood promotes strength ɑnd team effort tһrough sports аnd
    arts. Graduates ɑre prepared for success іn universities and
    bеyond, embodying perseverance аnd cultural acumen.

    Catholic Junior College սѕes a transformative
    educational experience centered οn classic values ⲟf empathy, integrity, аnd pursuit of truth,
    cultivating ɑ close-knit community ԝheгe trainees feel supported аnd inspired
    tߋ grow both intellectually аnd spiritually in a
    peaceful and inclusive setting. Ꭲһе college supplies extensive scholastic programs іn thе liberal arts, sciences,
    and social sciences, ⲣrovided bʏ enthusiastic and knowledgeable mentors ѡhо use innovative
    mentor ɑpproaches to spark іnterest аnd encourage
    deep,meaningful learning tһat extends faг beyοnd evaluations.
    Αn vibrant selection ⲟf co-curricular activities, including
    competitive sports teams tһat promote physical health ɑnd friendship, іn addіtion to creative societies
    tһat support innovative expression tһrough drama and visual arts,
    mɑkes it possіble forr students to explore tһeir interests and establish wеll-rounded
    personalities. Opportunities fоr meaningful community service, ѕuch
    ass collaborations wіth regional charities аnd international humanitarian journeys,
    һelp construct empathy, leadership skills, ɑnd ɑ reral dedication t᧐ making
    ɑ difference іn thе lives of otheгѕ. Alumni fгom Catholic Junior College frequently emerge аs caring аnd ethical leaders in numerous expert fields, equipped ѡith tһе knowledge,
    strength, and ethical compass tօ contribute favorably аnd sustainably to society.

    Avoid tаke lightly lah, pair a reputable Junior College рlus math proficiency fօr guarantee
    hіgh А Levels resuⅼts and effortless transitions.
    Parents, fear tһe gap hor, mathematics groundwork гemains essential Ԁuring Junior College for grasping figures, essential foor tⲟԁay’s online economy.

    Folks, kiasu mode activated lah, robust prikmary maths guides fоr improved scientific grasp рlus engineering dreams.

    Aiyah, primary maths teaches everyday սses liҝе money
    management, therefⲟre make sᥙre your youngster gets it properly from early.

    Eh eh, calm pom рi pi, math proves among fгom thе top topics ɗuring Junior College, establishing foundation fоr A-Level advanced math.

    Math аt A-levels teaches precision, ɑ skill vital foг Singapore’ѕ innovation-driven economy.

    Folks, worry about the disparity hor, math base іs critical
    Ԁuring Junior College tο comprehending data, crucial witһin modern tech-driven market.

    Wah lao, no matter іf institution proves һigh-еnd, mathematics is the make-or-break subject іn cultivates confidence гegarding figures.

    Feel free tо surf tⲟ my wweb site – Bedok South Secondary School

  6. купить диплом с проведением в [url=frei-diplom5.ru]купить диплом с проведением в[/url] .

    Diplomi_tePa

    24 Oct 25 at 4:59 pm

  7. купить диплом колледжа искусств в спб [url=frei-diplom12.ru]frei-diplom12.ru[/url] .

    Diplomi_cdPt

    24 Oct 25 at 5:00 pm

  8. купить диплом средне техническое [url=https://rudik-diplom2.ru/]купить диплом средне техническое[/url] .

    Diplomi_yrpi

    24 Oct 25 at 5:00 pm

  9. купить диплом [url=http://www.rudik-diplom6.ru]купить диплом[/url] .

    Diplomi_efKr

    24 Oct 25 at 5:00 pm

  10. Selamat datang di E28BET – Situs Judi Online No.
    1 di Asia Pasifik. Nikmati bonus, permainan seru, dan pengalaman taruhan online yang terpercaya.

  11. диплом об окончании техникума купить [url=www.frei-diplom11.ru/]диплом об окончании техникума купить[/url] .

    Diplomi_cqsa

    24 Oct 25 at 5:01 pm

  12. купить диплом в донском [url=www.rudik-diplom4.ru/]www.rudik-diplom4.ru/[/url] .

    Diplomi_vbOr

    24 Oct 25 at 5:01 pm

  13. winmore.bond – Impressive visuals and smooth interface; makes browsing enjoyable.

    Ricarda Rosan

    24 Oct 25 at 5:01 pm

  14. купить диплом о среднем образовании [url=http://educ-ua7.ru]http://educ-ua7.ru[/url] .

    Diplomi_kgea

    24 Oct 25 at 5:01 pm

  15. купить диплом в сочи [url=www.rudik-diplom11.ru/]купить диплом в сочи[/url] .

    Diplomi_kpMi

    24 Oct 25 at 5:01 pm

  16. можно купить диплом медсестры [url=http://www.frei-diplom13.ru]можно купить диплом медсестры[/url] .

    Diplomi_bjkt

    24 Oct 25 at 5:02 pm

  17. купить диплом с занесением в реестр барнаул [url=http://www.frei-diplom4.ru]купить диплом с занесением в реестр барнаул[/url] .

    Diplomi_wdOl

    24 Oct 25 at 5:03 pm

  18. bahis siteler 1xbet [url=https://1xbet-giris-10.com/]bahis siteler 1xbet[/url] .

    1xbet giris_rcka

    24 Oct 25 at 5:03 pm

  19. Quality articles or reviews is the main to attract the visitors
    to pay a visit the site, that’s what this web site is providing.

  20. купить проведенный диплом одно [url=frei-diplom1.ru]купить проведенный диплом одно[/url] .

    Diplomi_zrOi

    24 Oct 25 at 5:04 pm

  21. gameclub2u.com – Bookmarked this immediately, planning to revisit for updates and inspiration.

    Weston Allstott

    24 Oct 25 at 5:04 pm

  22. Since the admin of this web page is working, no question very shortly
    it will be famous, due to its quality contents.

    mba malaysia

    24 Oct 25 at 5:04 pm

  23. Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point.
    You definitely know what youre talking about, why throw away
    your intelligence on just posting videos to your weblog when you could be giving
    us something informative to read?

    Apex Bitlux Scam

    24 Oct 25 at 5:06 pm

  24. купить диплом вуза с проводкой [url=http://frei-diplom5.ru/]http://frei-diplom5.ru/[/url] .

    Diplomi_cdPa

    24 Oct 25 at 5:07 pm

  25. где купить диплом техникума старая пять плюс [url=http://www.frei-diplom12.ru]где купить диплом техникума старая пять плюс[/url] .

    Diplomi_dxPt

    24 Oct 25 at 5:07 pm

  26. connectinnovationhub.bond – The layout is clean and professional, very easy to navigate.

  27. купить диплом магистра [url=www.rudik-diplom11.ru/]купить диплом магистра[/url] .

    Diplomi_psMi

    24 Oct 25 at 5:07 pm

  28. диплом техникума купить цены [url=https://educ-ua7.ru/]https://educ-ua7.ru/[/url] .

    Diplomi_ajea

    24 Oct 25 at 5:07 pm

  29. Maligayang pagdating sa E28BET – Ang No. 1 Online Gambling Site sa
    Asia Pacific. Tangkilikin ang mga bonus,
    masasayang laro, at pinagkakatiwalaang karanasan sa online betting.

  30. купить диплом в кисловодске [url=https://www.rudik-diplom6.ru]купить диплом в кисловодске[/url] .

    Diplomi_qrKr

    24 Oct 25 at 5:08 pm

  31. 1xbet ?yelik [url=https://www.1xbet-giris-7.com]1xbet ?yelik[/url] .

    1xbet giris_zxKn

    24 Oct 25 at 5:08 pm

  32. I’m not sure why but this weblog is loading extremely
    slow for me. Is anyone else having this problem or is it a
    problem on my end? I’ll check back later and see if the problem still exists.

  33. куплю диплом младшей медсестры [url=http://www.frei-diplom13.ru]http://www.frei-diplom13.ru[/url] .

    Diplomi_tukt

    24 Oct 25 at 5:09 pm

  34. 1xbet com giri? [url=https://1xbet-giris-10.com]1xbet com giri?[/url] .

    1xbet giris_rbka

    24 Oct 25 at 5:09 pm

  35. trustandunity.bond – Overall a polished site with professional and engaging content.

  36. купить диплом экономиста [url=http://rudik-diplom10.ru]купить диплом экономиста[/url] .

    Diplomi_oiSa

    24 Oct 25 at 5:11 pm

  37. купить диплом в уссурийске [url=https://rudik-diplom2.ru]https://rudik-diplom2.ru[/url] .

    Diplomi_krpi

    24 Oct 25 at 5:11 pm

  38. Hello! I just want to give you a big thumbs
    up for your great information you’ve got here on this post.
    I will be coming back to your website for more soon.

  39. купить диплом журналиста [url=rudik-diplom15.ru]купить диплом журналиста[/url] .

    Diplomi_ekPi

    24 Oct 25 at 5:12 pm

  40. купить диплом техникума об окончании [url=http://educ-ua7.ru]http://educ-ua7.ru[/url] .

    Diplomi_atea

    24 Oct 25 at 5:12 pm

  41. купить диплом в липецке [url=http://rudik-diplom13.ru]купить диплом в липецке[/url] .

    Diplomi_cvon

    24 Oct 25 at 5:13 pm

  42. купить диплом техникума в москве недорого [url=https://frei-diplom11.ru/]купить диплом техникума в москве недорого[/url] .

    Diplomi_sfsa

    24 Oct 25 at 5:14 pm

  43. Great blog here! Additionally your site quite a bit up very
    fast! What host are there casinos in monaco; Alexis, you the usage of?
    Can I am getting your affiliate hyperlink for your host? I want my site loaded
    up as quickly as yours lol

    Alexis

    24 Oct 25 at 5:14 pm

  44. 1x bet [url=www.1xbet-giris-3.com]www.1xbet-giris-3.com[/url] .

    1xbet giris_rfMi

    24 Oct 25 at 5:15 pm

  45. 1xbet tr giri? [url=https://www.1xbet-giris-10.com]https://www.1xbet-giris-10.com[/url] .

    1xbet giris_doka

    24 Oct 25 at 5:15 pm

  46. We are a group of volunteers and starting a new scheme in our community.

    Your web site provided us with valuable info to work on. You’ve
    done a formidable job and our entire community will be thankful
    to you.

  47. купить диплом в сарове [url=https://www.rudik-diplom5.ru]купить диплом в сарове[/url] .

    Diplomi_ddma

    24 Oct 25 at 5:16 pm

  48. купить диплом в орле [url=rudik-diplom11.ru]rudik-diplom11.ru[/url] .

    Diplomi_pmMi

    24 Oct 25 at 5:16 pm

  49. купить диплом без реестра [url=https://frei-diplom4.ru]купить диплом без реестра[/url] .

    Diplomi_gjOl

    24 Oct 25 at 5:17 pm

Leave a Reply