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!
купить диплом бурильщика [url=https://rudik-diplom12.ru]https://rudik-diplom12.ru[/url] .
Diplomi_hiPi
14 Oct 25 at 12:28 am
Вызов нарколога на дом сочетает медицинскую эффективность с удобством. Пациент получает квалифицированную помощь в привычной обстановке, что снижает уровень тревожности и способствует более быстрому восстановлению.
Исследовать вопрос подробнее – [url=https://narkolog-na-dom-sankt-peterburg14.ru/]вызов нарколога на дом санкт-петербург[/url]
Jerrysmism
14 Oct 25 at 12:30 am
согласование перепланировки в нежилом здании [url=https://pereplanirovka-nezhilogo-pomeshcheniya11.ru]согласование перепланировки в нежилом здании[/url] .
pereplanirovka nejilogo pomesheniya_yxer
14 Oct 25 at 12:31 am
Nacho Vidal
Brentsek
14 Oct 25 at 12:31 am
электрические гардины [url=https://www.karniz-elektroprivodom.ru]электрические гардины[/url] .
karniz elektroprivodom shtor kypit_flei
14 Oct 25 at 12:33 am
Экскурсии по Казани — обзор маршрутов и лучших туров по Казани
Казань — жемчужина Поволжья с богатой историей и неповторимой культурой. Если вы ищете интересные экскурсии по Казани, на нашем сайте представлены лучшие маршруты — от обзорных программ до авторских прогулок.
[url=https://to-kazan.ru/tours/ekskursii-kazan/nochnaya]ночная экскурсия по казани[/url]
Экскурсии Казань — автобусные, пешеходные и тематические туры
Мы предлагаем разнообразные экскурсии Казань: обзорные автобусные маршруты (включают Кремль, Баумана, Кабан и Старо-Татарскую Слободу), пешеходные прогулки, гастрономические экскурсии, квесты и семейные форматы.
Что такое обзорная экскурсия по Казани
Отзывы туристов подтверждают: «Казань за 4 часа — экскурсия Казань за 4 часа + Кремль… экскурсовод Елена увлекла рассказом».
Программа включает:
посещение Казанского Кремля и мечети Кул-Шариф;
знакомство с озером Кабан, ул. Баумана и памятниками города .
https://to-kazan.ru/tours/sviyajsk
казань автобусная экскурсия
Экскурсии в Казани — вечерние и ночные маршруты
Если вы хотите увидеть город в другом свете, выбирайте экскурсии в Казани вечером. Самый популярный формат — ночная экскурсия Казань, когда подсветка архитектурных объектов — Кремль, ЗАГС, мост Миллениум — создаёт невероятные впечатления.
Обзорные экскурсии Казань по ночному городу
Тур длится около 2–3 часов и включает: заезд к ключевым смотровым точкам, прогулку по набережной Казанки с иллюминацией, катание на колесе обозрения «Вокруг света».
Почему выбрать именно экскурсию Казань от нас?
Лицензированные гиды с живым, эмоциональным стилем (отзывы: «гид Марсель — просто супер-гид!»)
Малые группы для комфортного восприятия и безопасных остановок
Современный и удобный транспорт, радиогиды, подогрев зимний-зимний сезон
Возможность онлайн бронирования и подтверждение через сайт
Казань экскурсия — что входит и сколько длится
Автобус от центра Казани (чаще всего — район метро «Кремлёвская»)
Гид ведет экскурсию как в автобусе, так и при остановках
Основные объекты: Кремль, мечеть Кул-Шариф, улица Баумана, озеро Кабан, Старо-Татарская слобода, теcатр Камала
В вечерних версиях: мост Миллениум, дворец земледельцев, стадион «Казань Арена» ночью; плюс колесо обозрения
Сколько стоят экскурсии в Казани.
BrianRhype
14 Oct 25 at 12:33 am
order ED pills online UK: buy viagra – buy viagra online
Brettesofe
14 Oct 25 at 12:34 am
Sou viciado no fluxo de Brazino Casino, tem um ritmo de jogo que reluz como um coral. As opcoes sao ricas e reluzem como conchas. incluindo jogos de mesa com um toque aquatico. O servico e confiavel como uma ancora. respondendo rapido como uma onda quebrando. Os saques sao velozes como um mergulho. porem mais giros gratis seriam subaquaticos. Ao final, Brazino Casino oferece uma experiencia que e puro mergulho para os exploradores de jogos online! Por sinal o design e um espetaculo visual aquatico. amplificando o jogo com vibracao aquatica.
brazino777 cГіdigo promocional|
whimsybubblecrab6zef
14 Oct 25 at 12:34 am
$MTAUR ICO is gaining traction over SHIB/XRP rallies. Token’s in-game convertibility ensures demand. Presale’s 1.4M USDT milestone proves it.
minotaurus ico
WilliamPargy
14 Oct 25 at 12:35 am
Получить диплом любого университета мы поможем. Купить диплом в Минске – [url=http://diplomybox.com/kupit-diplom-v-minske/]diplomybox.com/kupit-diplom-v-minske[/url]
Cazruje
14 Oct 25 at 12:36 am
электрокарниз двухрядный [url=http://www.karniz-elektroprivodom.ru]http://www.karniz-elektroprivodom.ru[/url] .
karniz elektroprivodom shtor kypit_pyei
14 Oct 25 at 12:36 am
Hi there, constantly i used to check blog
posts here early in the break of day, as i like
to find out more and more.
beste online casino schweiz
14 Oct 25 at 12:38 am
проект перепланировки нежилого помещения [url=http://www.pereplanirovka-nezhilogo-pomeshcheniya11.ru]проект перепланировки нежилого помещения[/url] .
pereplanirovka nejilogo pomesheniya_rrer
14 Oct 25 at 12:38 am
Great items from you, man. I have keep in mind your stuff prior to and you’re simply
extremely wonderful. I really like what you’ve got here, certainly like what you are stating
and the way in which by which you say it. You make it enjoyable and you still take care of to stay
it wise. I cant wait to learn far more from you. This is really a tremendous website.
simone berry
14 Oct 25 at 12:42 am
электрокарнизы в москве [url=https://elektrokarnizy797.ru/]электрокарнизы в москве[/url] .
elektrokarnizi_njMl
14 Oct 25 at 12:44 am
Estou alucinado com PlayPix Casino, pulsa com uma forca de cassino digna de um hacker. O leque do cassino e uma matriz de delicias. com caca-niqueis que reluzem como bytes. Os agentes processam como CPUs. oferecendo respostas claras como um codigo. Os pagamentos sao lisos como um buffer. porem queria mais promocoes que glitcham como retro. Para encurtar, PlayPix Casino garante um jogo que reluz como pixels para os fas de adrenalina pixelada! E mais o layout e vibrante como um codigo. adicionando um toque de codigo ao cassino.
playpix Г© legalizada|
zapwhirlwindostrich3zef
14 Oct 25 at 12:46 am
карниз для штор с электроприводом [url=https://karniz-elektroprivodom.ru]карниз для штор с электроприводом[/url] .
karniz elektroprivodom shtor kypit_guei
14 Oct 25 at 12:48 am
согласование перепланировки нежилого помещения [url=https://pereplanirovka-nezhilogo-pomeshcheniya11.ru]согласование перепланировки нежилого помещения[/url] .
pereplanirovka nejilogo pomesheniya_oyer
14 Oct 25 at 12:49 am
zyloprim for sale
zyloprim for sale
14 Oct 25 at 12:50 am
Curto demais a chama de Fogo777 Casino, pulsa com uma forca de cassino digna de um xama. Os jogos formam uma fogueira de diversao. com slots tematicos de cerimonias antigas. O suporte e um fulgor reluzente. respondendo rapido como uma labareda. As transacoes sao faceis como um fulgor. ocasionalmente as ofertas podiam ser mais generosas. Resumindo, Fogo777 Casino garante um jogo que reluz como chamas para os viciados em emocoes de cassino! E mais a plataforma reluz com um visual ritualistico. elevando a imersao ao nivel de um ritual.
fogo777 app|
flamewhirlwindemu2zef
14 Oct 25 at 12:50 am
Sou totalmente viciado em BETesporte Casino, e uma plataforma que vibra como um estadio em dia de final. O catalogo e vibrante e diversificado, incluindo apostas esportivas que aceleram o pulso. 100% ate R$600 + apostas gratis. O suporte ao cliente e excepcional, com suporte rapido e preciso. Os ganhos chegam sem atraso, contudo recompensas extras seriam um hat-trick. No fim, BETesporte Casino vale uma aposta certa para entusiastas de jogos modernos ! Alem disso a plataforma e visualmente impactante, facilita uma imersao total. Outro destaque o programa VIP com niveis exclusivos, oferece recompensas continuas.
http://www.betesporte365.app|
VortexGoalW2zef
14 Oct 25 at 12:50 am
потолочников натяжные потолки [url=http://stretch-ceilings-samara-1.ru]потолочников натяжные потолки[/url] .
natyajnie potolki samara_swsl
14 Oct 25 at 12:51 am
wavefusion – Clean typography and spacing, reading is effortless throughout.
Walker Daves
14 Oct 25 at 12:52 am
согласовать перепланировку нежилого помещения [url=https://www.pereplanirovka-nezhilogo-pomeshcheniya9.ru]https://www.pereplanirovka-nezhilogo-pomeshcheniya9.ru[/url] .
pereplanirovka nejilogo pomesheniya_lkKl
14 Oct 25 at 12:52 am
https://www.imdb.com/list/ls4155634718/
vudgyft
14 Oct 25 at 12:53 am
карниз с приводом [url=www.karniz-elektroprivodom.ru/]www.karniz-elektroprivodom.ru/[/url] .
karniz elektroprivodom shtor kypit_rvei
14 Oct 25 at 12:54 am
Каждый этап имеет ключевое значение и обеспечивает устойчивость результата.
Выяснить больше – [url=https://lechenie-alkogolizma-doneczk0.ru/]лечение алкоголизма и наркомании центр в донце[/url]
PhillipJab
14 Oct 25 at 12:55 am
UK chemist Prednisolone delivery: order steroid medication safely online – order steroid medication safely online
JamesDes
14 Oct 25 at 12:56 am
Je suis envoute par BankOnBet Casino, c’est un casino en ligne qui brille comme un coffre-fort de lingots. La selection du casino est une pile de plaisirs. offrant des lives qui grossissent les comptes. The support is as solid as a vault door. avec une aide qui debloque les gains. Les gains du casino arrivent a une vitesse bancaire. mais I’d want more promos that compound like interest. All in all, BankOnBet Casino est un vault de thrills pour ceux qui cherchent l’adrenaline securisee du casino! A noter l’interface du casino est fluide et securisee comme un coffre. amplifiant le jeu avec style securise.
bankonbet bonusovГЅ kГіd|
twistyneonemu3zef
14 Oct 25 at 12:59 am
Fiquei fascinado com PlayPIX Casino, oferece um prazer intenso e indomavel. A selecao de jogos e fenomenal, incluindo apostas esportivas que aceleram o coracao. Eleva a experiencia de jogo. O servico esta disponivel 24/7, com suporte rapido e preciso. Os ganhos chegam sem atraso, embora mais rodadas gratis seriam um diferencial. Para finalizar, PlayPIX Casino vale uma visita epica para quem aposta com cripto ! Alem disso o site e rapido e cativante, tornando cada sessao mais vibrante. Muito atrativo o programa VIP com niveis exclusivos, proporciona vantagens personalizadas.
Ler os detalhes|
JungleVibeK8zef
14 Oct 25 at 12:59 am
электрокарниз двухрядный [url=https://karniz-elektroprivodom.ru/]https://karniz-elektroprivodom.ru/[/url] .
karniz elektroprivodom shtor kypit_yrei
14 Oct 25 at 1:00 am
согласование проекта перепланировки нежилого помещения [url=www.pereplanirovka-nezhilogo-pomeshcheniya11.ru/]www.pereplanirovka-nezhilogo-pomeshcheniya11.ru/[/url] .
pereplanirovka nejilogo pomesheniya_fjer
14 Oct 25 at 1:03 am
Автоматические гаражные ворота давно перестали быть роскошью и стали необходимым элементом комфортной жизни. Наши автоматические ворота сочетают надёжность проверенных европейских механизмов с элегантным дизайном, который гармонично впишется в архитектуру любого здания. Мы предлагаем полный цикл услуг: от профессиональной консультации и точного замера до установки под ключ и гарантийного обслуживания. Доверьте безопасность своего дома профессионалам — получите бесплатный расчёт стоимости уже сегодня: Подробнее
CraigStaps
14 Oct 25 at 1:04 am
перепланировка нежилого помещения в многоквартирном доме [url=https://www.pereplanirovka-nezhilogo-pomeshcheniya11.ru]перепланировка нежилого помещения в многоквартирном доме[/url] .
pereplanirovka nejilogo pomesheniya_mger
14 Oct 25 at 1:04 am
https://rafaelcodre.ampblogs.com/se-rumorea-zumbido-en-detox-examen-de-orina-74536267
Limpieza para examen de miccion se ha transformado en una opcion cada vez mas reconocida entre personas que requieren eliminar toxinas del sistema y superar pruebas de analisis de drogas. Estos productos estan disenados para ayudar a los consumidores a limpiar su cuerpo de componentes no deseadas, especialmente aquellas relacionadas con el consumo de cannabis u otras sustancias ilicitas.
El buen detox para examen de orina debe brindar resultados rapidos y visibles, en especial cuando el tiempo para prepararse es limitado. En el mercado actual, hay muchas variedades, pero no todas prometen un proceso seguro o rapido.
Que funciona un producto detox? En terminos claros, estos suplementos operan acelerando la eliminacion de metabolitos y toxinas a traves de la orina, reduciendo su presencia hasta quedar por debajo del limite de deteccion de ciertos tests. Algunos funcionan en cuestion de horas y su impacto puede durar entre 4 a cinco horas.
Parece fundamental combinar estos productos con correcta hidratacion. Beber al menos 2 litros de agua diariamente antes y despues del consumo del detox puede mejorar los resultados. Ademas, se recomienda evitar alimentos grasos y bebidas procesadas durante el proceso de desintoxicacion.
Los mejores productos de limpieza para orina incluyen ingredientes como extractos de hierbas, vitaminas del complejo B y minerales que favorecen el funcionamiento de los organos y la funcion hepatica. Entre las marcas mas destacadas, se encuentran aquellas que presentan certificaciones sanitarias y estudios de prueba.
Para usuarios frecuentes de THC, se recomienda usar detoxes con ventanas de accion largas o iniciar una preparacion temprana. Mientras mas larga sea la abstinencia, mayor sera la efectividad del producto. Por eso, combinar la organizacion con el uso correcto del suplemento es clave.
Un error comun es suponer que todos los detox actuan igual. Existen diferencias en dosis, sabor, metodo de toma y duracion del resultado. Algunos vienen en formato liquido, otros en capsulas, y varios combinan ambos.
Ademas, hay productos que incluyen fases de preparacion o preparacion previa al dia del examen. Estos programas suelen instruir abstinencia, buena alimentacion y descanso adecuado.
Por ultimo, es importante recalcar que todo detox garantiza 100% de exito. Siempre hay variables individuales como metabolismo, frecuencia de consumo, y tipo de examen. Por ello, es vital seguir las instrucciones del fabricante y no descuidarse.
JuniorShido
14 Oct 25 at 1:07 am
BritPharm Online: British online pharmacy Viagra – BritPharm Online
JamesDes
14 Oct 25 at 1:07 am
https://www.imdb.com/list/ls4155220293/
oczmrmh
14 Oct 25 at 1:07 am
Hello there! Do you use Twitter? I’d like to follow you if that
would be okay. I’m absolutely enjoying your blog and look forward to new
posts.
sandibet
14 Oct 25 at 1:09 am
карниз с приводом [url=https://www.karniz-elektroprivodom.ru]https://www.karniz-elektroprivodom.ru[/url] .
karniz elektroprivodom shtor kypit_zcei
14 Oct 25 at 1:10 am
Good web site you have here.. It’s hard to
find quality writing like yours these days. I truly appreciate individuals
like you! Take care!!
rent wedding car Malaysia
14 Oct 25 at 1:10 am
Minotaurus presale docs detail fair distribution. $MTAUR’s play-to-earn model sustainable. Endless mazes promise hours of play.
mtaur coin
WilliamPargy
14 Oct 25 at 1:10 am
согласование перепланировок нежилых помещений [url=www.pereplanirovka-nezhilogo-pomeshcheniya11.ru/]www.pereplanirovka-nezhilogo-pomeshcheniya11.ru/[/url] .
pereplanirovka nejilogo pomesheniya_uwer
14 Oct 25 at 1:11 am
minomycin online
minomycin online
14 Oct 25 at 1:13 am
Good post. I definitely love this site. Stick with it!
Seriously
14 Oct 25 at 1:14 am
вывод из запоя
vivod-iz-zapoya-omsk011.ru
вывод из запоя круглосуточно омск
lechenieomskNeT
14 Oct 25 at 1:14 am
карниз с электроприводом [url=https://www.karniz-elektroprivodom.ru]карниз с электроприводом[/url] .
karniz elektroprivodom shtor kypit_jvei
14 Oct 25 at 1:17 am
minomycin online
minomycin online
14 Oct 25 at 1:19 am
Сочетание этих методов позволяет добиваться стойкой ремиссии и укреплять здоровье пациентов.
Изучить вопрос глубже – [url=https://lechenie-alkogolizma-tver0.ru/]лечение хронического алкоголизма[/url]
WilfredWAr
14 Oct 25 at 1:21 am
Watch out, Orlando, a new world theme park capital is rising in the Arabian desert
[url=https://tripscan44.cc]трип скан[/url]
For decades, Orlando has reigned as the global capital of theme parks — a place where Disney, Universal, SeaWorld and countless other attractions have drawn millions of visitors.
But a challenger for the crown has emerged from an unlikely place: the deserts of the Arabian Gulf. In a destination once known more for oil wealth and camel racing than roller coasters, Abu Dhabi is building an adrenaline-charged playground that could give Orlando a run for its money.
And it just landed the ultimate weapon: Disney.
https://tripscan44.cc
tripscan
In May 2025, when Disney announced its first new theme park in 15 years, it chose Abu Dhabi over other key theme park destinations in California, Japan and even Orlando.
There was “no question,” says Josh D’Amaro, chairman of Disney Experiences. The UAE capital, already home to Ferrari World, with the world’s fastest roller coaster; Warner Bros. World (built under license by CNN’s parent company, Warner Brothers Discovery); Yas Waterworld, an epic network of slides and pools; and more recently, SeaWorld Yas Island Abu Dhabi. It’s clear the emirate is emerging as the most serious challenger Orlando has ever faced.
Ferrari World Abu Dhabi is home to the world’s fastest rollercoaster and the highest loop ride.
Ferrari World Abu Dhabi is home to the world’s fastest rollercoaster and the highest loop ride. Leisa Tyler/LightRocket/Getty Images
Disneyland Abu Dhabi, expected to open on Yas Island in the early 2030s, will be the company’s most technologically advanced park ever. Renderings show a shimmering, futuristic tower at its center — more closely resembling Abu Dhabi’s gleaming skyline than a traditional European castle. It will be the first Disney resort set on an accessible shoreline, located just 20 minutes from downtown Abu Dhabi.
Related video
What began as a shared passion between two friends has grown into the “Abu Dhabi House Movement” — a fast-growing community redefining the city’s music scene. Co-founder Tom Worton takes us inside this grassroots world, where music lovers, DJs, and cultural spaces collide.
video
House beats and hidden venues: A new sound is emerging in Abu Dhabi
The theme park will be developed, built and operated by Miral, the Abu Dhabi company behind Yas Island’s roster of other attractions. Disney Imagineers will handle creative design and operational oversight, making sure the new park is in keeping with Disney’s brand.
Miral’s CEO, Mohamed Abdalla Al Zaabi, says demand already exists: 2024 saw a 20% rise in theme park attendance on Yas Island. And expansion is already in the works — a Harry Potter–themed land at Warner Bros. World, more record-breaking rides at Ferrari World, new themed hotels, and even two beaches along Yas Bay Waterfront.
‘This isn’t about building another theme park’
disney 3.jpg
Why Disney chose Abu Dhabi for their next theme park location
7:02
Abu Dhabi’s location, a medium-haul flight away from both Europe and Asia, and relatively short hop away from India, means millions of potential visitors are within relatively easy reach.
“This isn’t about building another theme park,” Saleh Mohamed Al Geziry, Abu Dhabi’s director general of tourism, told CNN. “It’s about defining Abu Dhabi as a global destination where culture, entertainment and luxury intersect.”
DanielZep
14 Oct 25 at 1:23 am
где купить дипломы медсестры [url=https://frei-diplom15.ru/]где купить дипломы медсестры[/url] .
Diplomi_twoi
14 Oct 25 at 1:24 am