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!
«Трезвая Орбита» — круглосуточная наркологическая клиника экстренной и плановой помощи. Мы работаем по Москве и области 24/7, выезжаем на дом без опознавательных знаков, принимаем в стационаре с круглосуточным наблюдением и ведём пациента до устойчивой ремиссии. Наша философия — безопасность, конфиденциальность и предсказуемый результат: от первой стабилизации до профилактики рецидивов с чётким планом действий для пациента и семьи.
Получить дополнительные сведения – [url=https://narkologicheskaya-klinika-moskva8.ru/]наркологическая клиника москва[/url]
Thomasnup
28 Oct 25 at 10:39 pm
Wah lao, no matter іf school is fancy, maths is thе make-or-break discipline іn developing poise in figures.
Alas, primary math teaches practical implementations including budgeting, ѕo maҝe ѕure үour youngster gets this
correctly Ьeginning yօung age.
National Junior College, as Singapore’ѕ pioneering junior college, սses exceptional opportunities fߋr
intellectual and leadership growth іn a historical setting.
Itѕ boarding program ɑnd гesearch centers foster ѕeⅼf-reliance and development amongat varied trainees.
Programs іn arts, sciences, and liberal arts, including electives, motivae deep expedition ɑnd quality.
Global collaborations аnd exchanges expand horizons ɑnd build
networks. Alumni lead іn ԁifferent fields, showіng the college’ѕ enduring
impact on nation-building.
Eunoia Junior College embodies tһe pinnacle օf modern academic innovation, housed іn a striking һigh-rise campus thаt
perfectly integrates communal learning ɑreas, green locations, ɑnd advanced technological centers to develop аn motivating environment for collective аnd experiential education. Тhe college’s
special viewpoint օf ” stunning thinking” encourages students
tօ mix intellectual curiosity ᴡith compassion ɑnd ethical
reasoning, supported ƅy dynamic scholastic programs іn the arts,
sciences, and interdisciplinary studies thаt promote imaginative
analytical and forward-thinking. Geared
սⲣ with top-tier facilities ѕuch as professional-grade carrying ᧐ut arts theaters, multimedia studios, аnd interactive science laboratories, students аrе
empowered tο pursue theіr enthusiasms and develop remarkable skills іn a holistic
way. Thdough tactical partnerships ᴡith leading universities аnd
industry leaders, tһe college prοvides
enriching opportunities fоr undergraduate-level reѕearch study, internships, аnd
mentorship that bridge class knowing with real-worlⅾ applications.
Ꭺѕ a result, Eunoia Junior College’ѕ trainees proggress іnto
thoughtful, resistant leaders ᴡhо arе not jᥙѕt academically accomplished һowever аlso deeply committed tօ contributing positively tօ a
diverse and evеr-evolving global society.
Ⅾo not mess aroսnd lah, pair a excellent Junior College рlus maths excellence
tⲟ assure elevated Α Levels resultѕ pⅼus effortless changеs.
Mums and Dads, dread thе difference hor, math base гemains
essential in Junior College fօr understanding figures, vital fⲟr modern tech-driven economy.
Alas, primary math teaches everyday implementations ⅼike financial planning, thus make ѕure
your youngster gets that right from үoung age.
Aiyo, lacking strong maths ɑt Junior College, no matter
top school youngsters coᥙld faltyer in secondary
equations, tһerefore develop it immediatеly leh.
Ꮤithout solid Math scores in A-levels, options fоr science streams dwindle faѕt іn uni
admissions.
Mums ɑnd Dads, fear the difference hor, maths base іѕ essential in Junior College іn grasping infߋrmation, essential іn current
online system.
Goodness, evеn if establishment proves fancy, maths іs the critical discipline tⲟo developing poise in numƄers.
junior college
28 Oct 25 at 10:41 pm
Детокс — это управляемая последовательность действий: оценка рисков, инфузионная терапия, коррекция электролитов и КЩС, поддержка органов-мишеней, профилактика осложнений, затем переоценка с корректировкой схемы. Мы заранее обсуждаем «бытовой контур» на ближайшие дни: максимально спокойные вечера, дробное питание, отказ от перегрузок, перенос «триггерных» встреч, чтобы результат не рассыпался после первых суток.
Детальнее – https://narkologicheskaya-klinika-sergiev-posad8.ru/anonimnaya-narkologicheskaya-klinika-v-sergievom-posade
RonnyCaure
28 Oct 25 at 10:42 pm
кракен тор
кракен онион
Henryamerb
28 Oct 25 at 10:43 pm
купить диплом в коврове [url=https://www.rudik-diplom7.ru]купить диплом в коврове[/url] .
Diplomi_ifPl
28 Oct 25 at 10:45 pm
alarm clock radio with cd player and usb charging [url=www.alarm-radio-clocks.com/]www.alarm-radio-clocks.com/[/url] .
Cd Player Radio Alarm Clocks_yfOa
28 Oct 25 at 10:46 pm
Где купить Шишки в Икше?Нашел на https://mentaragua.ru
– вроде как нормальные цены и отзывы. Доставка работает. Кто-нибудь заказывал их услугами? Насколько качественный товар?
Stevenref
28 Oct 25 at 10:46 pm
This is my first time pay a quick visit at here and i am actually impressed to read all at one place.
AYUTOGEL
28 Oct 25 at 10:48 pm
cap-dieu-khien-sangjin.xyz
PHP hook, building hooks in your application – Sjoerd Maessen blog at Sjoerd Maessen blog
cap-dieu-khien-sangjin.xyz
28 Oct 25 at 10:48 pm
кракен vk5
кракен Москва
Henryamerb
28 Oct 25 at 10:49 pm
продвинуть сайт в москве [url=https://optimizaciya-i-seo-prodvizhenie-sajtov-moskva-1.ru]https://optimizaciya-i-seo-prodvizhenie-sajtov-moskva-1.ru[/url] .
optimizaciya i seo prodvijenie saitov moskva_wqPi
28 Oct 25 at 10:51 pm
hd tabletop radio [url=https://www.alarm-radio-clocks.com]https://www.alarm-radio-clocks.com[/url] .
Cd Player Radio Alarm Clocks_hgOa
28 Oct 25 at 10:52 pm
купить диплом зубного техника [url=https://rudik-diplom6.ru]купить диплом зубного техника[/url] .
Diplomi_kyKr
28 Oct 25 at 10:57 pm
кракен ios
kraken tor
Henryamerb
28 Oct 25 at 10:57 pm
главное что ты “вкурил”, а как мне тебе это втереть уже не важно https://oaoikma.ru Мало того дешёвый, он и отправляет маленький вес. Это гуд. Остальные почти все работают от 50 гр…
DannyTem
28 Oct 25 at 10:58 pm
Удобные и стильные [url=https://avtomaticheskie-karnizy-s-pultom.ru/]купить автоматический карниз +7 (499) 638-25-37[/url] делают управление шторами простым и комфортным.
Обслуживание таких карнизов довольно простое и не занимает много времени.
автоматический карниз комплект
28 Oct 25 at 10:58 pm
kraken vk3
кракен Москва
Henryamerb
28 Oct 25 at 10:58 pm
Hey hey, calm pom pi pi, mathematics is amοng of thе tⲟp topics ɗuring Junior College, building groundwork іn A-Level higher calculations.
Ᏼesides to school facilities, concentrate оn math to аvoid common errors suсh aѕ slpppy blunders ɑt tests.
Mums and Dads, competitive approach ⲟn lah,
robust primary maths leads tо improved scientific grasp аs wеll as construction aspirations.
Anderson Serangoon Junior College іs a vibrant institution born from the merger оf 2
ԝell-regarded colleges, cultivating аn encouraging
environment that highlights holistic development аnd academic excellence.
Τhе college boasts contemporary centers, including innovative labs ɑnd collective
spaces, mаking it ρossible for trainees t᧐ engage deeply
іn STEM and innovation-driven projects. Ꮤith ɑ strong concentrate on leadership and character structure, trainees
gain fгom diverse ⅽo-curricular activities tһаt cultivate strength ɑnd team effort.
Its dedication to worldwide perspectives tһrough exchange programs expands
horizons ɑnd prepares trainees f᧐r an interconnected world.
Graduates οften safe and secure places in leading universities,
ѕhowing tһe college’s commitment to nurturing positive, well-rounded people.
St. Joseph’ѕ Institution Junior College upholds cherished Lasallian traditions ᧐f faith, service, and intellectual curiosity, developing
ɑn empowering environment wһere trainees pursue
understanding ᴡith passion and dedicate tһemselves t᧐ uplifting otһers
through thoughtful actions. The integrated program еnsures a fluid progression from secondary tߋ pre-university levels, ᴡith a
concentrate ᧐n bilingual proficiency аnd innovative curricula
supported Ьy centers like ѕtate-of-the-art carrying out arts centers and science гesearch labs tһat motivate creative and analytical excellence.
International immersion experiences, including global service trips аnd
cultural exchange programs, widen students’ horizons, improve
linguistic skills, ɑnd foster a deep gratitude fοr diverse
worldviews. Opportunities fοr innovative researcһ, management roles іn trainee organizations,
аnd mentorship from accomplished faculty build
ѕelf-confidence, critical thinking, and a commitment to
ⅼong-lasting knowing. Graduates аre understood for theiг compassion and high achievements,
protecting ρlaces in prominent universities аnd standing oսt in professions thɑt
line uρ ԝith the college’s principles of service
ɑnd intellectual rigor.
Ɗon’t play play lah, combine ɑ reputable Junior College рlus mathematics proficiency fߋr
ensure superior Α Levels гesults ɑѕ weⅼl as
seamless transitions.
Parents, fear the difference hor, maths groundwork іs critical at
Junior College fߋr grasping informatiοn, crucial f᧐r toⅾay’ѕ online ѕystem.
Oh dear, mіnus robust math іn Junior College, гegardless leading establishment kids could falter at next-level
algebra, so develop іt promptly leh.
Wah, maths іs tһe base block іn primary education, aiding youngsters ᴡith dimensional reasoning to building paths.
Ɗon’t be kiasu for nothing; ace your A-levels to shag thoѕe scholarships аnd аvoid thе
competition later.
Οh man, rеgardless thοugh schookl proves fancy,maths is tһe decisive discipline tο
developing confidence with calculations.
Aiyah, primary math educates practical implementations ѕuch as money
management, therefore make sure your youngster gets that гight frοm yoᥙng.
mү web-site: korea math tutor english
korea math tutor english
28 Oct 25 at 10:58 pm
alarm clock with cd player [url=https://alarm-radio-clocks.com]https://alarm-radio-clocks.com[/url] .
Cd Player Radio Alarm Clocks_zkOa
28 Oct 25 at 11:01 pm
Artikel ini sangat menarik!
Penjelasan tentang KUBET sebagai Situs Judi Bola Terlengkap menurut saya sangat
akurat dan informatif.
Menurut pengalaman saya sendiri, situs seperti KUBET memberikan warna baru bagi dunia hiburan digital yang terus berkembang.
Apalagi sekarang semakin banyak pengguna yang mulai mencari alternatif terpercaya seperti Situs Parlay Resmi dan Situs Parlay Gacor.
Hal paling menarik dari tulisan ini adalah pembahasan tentang Situs Mix Parlay dan Situs Judi Bola
yang terus berinovasi menghadirkan pengalaman bermain yang
lebih seru dan modern.
Saya sendiri pernah membaca beberapa review tentang toto macau dan sempat mencoba kubet login untuk memahami bagaimana sistemnya bekerja
— hasilnya cukup memuaskan dan mudah digunakan.
Selain tampilan yang menarik, situs parlay kini juga menawarkan fitur yang lebih cepat dan aman dibandingkan dulu.
Bagi saya, penulis berhasil menyampaikan informasi dengan cara yang sederhana
tapi tetap mendalam.
Artikel ini cocok untuk siapa saja yang ingin tahu lebih
banyak tentang KUBET, Situs Judi Bola Terlengkap, dan juga berbagai situs parlay yang
terpercaya.
Saya pribadi merasa pembahasan tentang keamanan dan kenyamanan pengguna sangat
penting di era digital seperti sekarang ini.
Terima kasih kepada penulis yang sudah menyusun artikel dengan gaya bahasa ringan namun tetap informatif.
Semoga ke depan ada lebih banyak artikel yang membahas tentang strategi bermain di Situs Parlay Gacor,
tips aman login di kubet login, atau bahkan panduan lengkap seputar toto macau yang
kini semakin populer di Asia.
Tulisan seperti ini benar-benar membantu pembaca memahami
dunia hiburan online secara positif dan bijak.
KUBET
28 Oct 25 at 11:02 pm
кракен даркнет
kraken darknet market
Henryamerb
28 Oct 25 at 11:03 pm
купить свидетельство о рождении [url=rudik-diplom7.ru]купить свидетельство о рождении[/url] .
Diplomi_uwPl
28 Oct 25 at 11:04 pm
https://portfolio.newschool.edu/jeffreyespinoza95/2015/04/05/entry-9/#comment-103550
StanleyEsoms
28 Oct 25 at 11:05 pm
みんなの fx 評判
みんなの fx
28 Oct 25 at 11:07 pm
You really make it seem so easy with your presentation but
I find this matter to be actually something which I think
I would never understand. It seems too complex and extremely broad for me.
I’m looking forward for your next post, I will try to get the hang of it!
site
28 Oct 25 at 11:08 pm
кракен vk4
кракен Москва
Henryamerb
28 Oct 25 at 11:09 pm
руководства по seo [url=https://statyi-o-marketinge7.ru/]руководства по seo[/url] .
stati o marketinge _szkl
28 Oct 25 at 11:09 pm
Получить диплом о высшем образовании мы поможем. Купить диплом специалиста в Чите – [url=http://diplomybox.com/kupit-diplom-spetsialista-v-chite/]diplomybox.com/kupit-diplom-spetsialista-v-chite[/url]
Cazrnky
28 Oct 25 at 11:09 pm
Hey very interesting blog!
water heater repair service
28 Oct 25 at 11:10 pm
Как купить Меф в Красном Куте?Заметил на https://klopovbolshenet.ru
– по отзывам нормально. Цены приемлемые, курьерская доставка. Кто-то пользовался? Насколько хороший товар?
Stevenref
28 Oct 25 at 11:10 pm
Offre promotionnelle 1xBet pour 2026 : recevez une offre de 100% jusqu’a 130€ en vous inscrivant des maintenant. Une opportunite exceptionnelle pour les amateurs de paris sportifs, incluant des paris gratuits. Inscrivez-vous avant la fin de l’annee 2026. Decouvrez le code promotionnel 1xBet via le lien fourni ? https://www.atrium-patrimoine.com/wp-content/artcls/?code_promo_196.html.
Barrybleld
28 Oct 25 at 11:12 pm
best alarm clock radio with cd player [url=alarm-radio-clocks.com]alarm-radio-clocks.com[/url] .
Cd Player Radio Alarm Clocks_ajOa
28 Oct 25 at 11:13 pm
продвижения сайта в google [url=http://www.optimizaciya-i-seo-prodvizhenie-sajtov-moskva-1.ru]продвижения сайта в google[/url] .
optimizaciya i seo prodvijenie saitov moskva_xmPi
28 Oct 25 at 11:14 pm
best clock radios with cd player [url=http://www.alarm-radio-clocks.com]http://www.alarm-radio-clocks.com[/url] .
Cd Player Radio Alarm Clocks_bfOa
28 Oct 25 at 11:14 pm
Домашний визит — это кратчайший путь к облегчению симптомов, когда нет признаков осложнений. Врач приезжает на неприметном транспорте, проводит очную оценку, измеряет давление, пульс, сатурацию, оценивает неврологический статус и психическое состояние, после чего назначает инфузионную терапию и симптоматические средства по показаниям. Мы заранее даём семье простые инструкции на 24–48 часов, чтобы обеспечить спокойный режим, контроль питья, коррекцию сна и своевременную связь с дежурным врачом.
Подробнее можно узнать тут – https://narkologicheskaya-klinika-moskva8.ru/chastnaya-narkologicheskaya-klinika-v-moskve
Thomasnup
28 Oct 25 at 11:15 pm
https://t.me/Official_mellstroy_casino/51
Calvindreli
28 Oct 25 at 11:16 pm
https://mysocialport.com/story5972186/meilleur-code-promo-1xbet-rdc
Stanleyinvep
28 Oct 25 at 11:16 pm
продвижение по трафику [url=http://optimizaciya-i-seo-prodvizhenie-sajtov-moskva-1.ru]продвижение по трафику[/url] .
optimizaciya i seo prodvijenie saitov moskva_srPi
28 Oct 25 at 11:16 pm
кракен тор
kraken tor
Henryamerb
28 Oct 25 at 11:17 pm
купить диплом в березниках [url=https://rudik-diplom6.ru]купить диплом в березниках[/url] .
Diplomi_goKr
28 Oct 25 at 11:17 pm
kraken vk3
кракен ссылка
Henryamerb
28 Oct 25 at 11:18 pm
https://t.me/Official_mellstroy_casino/32
Calvindreli
28 Oct 25 at 11:18 pm
купить диплом в сызрани [url=http://www.rudik-diplom7.ru]купить диплом в сызрани[/url] .
Diplomi_afPl
28 Oct 25 at 11:18 pm
блог интернет-маркетинга [url=statyi-o-marketinge6.ru]statyi-o-marketinge6.ru[/url] .
stati o marketinge _xtkn
28 Oct 25 at 11:19 pm
Госпитализация разворачивается как последовательность шагов: приём и допуск к терапии, старт инфузий, мониторинг 24/7, регулярная переоценка и подготовка к выписке. Такой контур особенно важен пациентам с сопутствующими диагнозами (гипертония, ИБС, сахарный диабет, заболевания ЖКТ), где требуется деликатная настройка дозировок и темпа инфузий.
Подробнее – [url=https://narkologicheskaya-klinika-sergiev-posad8.ru/]частная наркологическая клиника[/url]
RonnyCaure
28 Oct 25 at 11:19 pm
alarm clock with usb music player [url=www.alarm-radio-clocks.com/]www.alarm-radio-clocks.com/[/url] .
Cd Player Radio Alarm Clocks_yeOa
28 Oct 25 at 11:20 pm
Онлайн-блог https://intellector-school.ru о нейросетях: от базовой линейной алгебры до Transformer и LLM. Пошаговые проекты, код на Git-стиле, эксперименты, метрики, тюнинг гиперпараметров, ускорение на GPU. Обзоры курсов, книг и инструментов, подборка задач для практики и подготовки к интервью.
Richardbuisk
28 Oct 25 at 11:21 pm
Освойте режиссуру https://rasputinacademy.ru событий и маркетинг: концепция, сценарий, сцена и свет, звук, видео, интерактив. Бюджет и смета, закупки, подрядчики, тайминг, риск-менеджмент. Коммьюнити, PR, лидогенерация, спонсорские пакеты, метрики ROI/ROMI. Практические задания и шаблоны документов.
Michaeldunty
28 Oct 25 at 11:22 pm
кракен вход
kraken onion
Henryamerb
28 Oct 25 at 11:23 pm
I’m amazed, I must say. Seldom do I encounter a blog that’s equally educative and engaging,
and without a doubt, you have hit the nail on the head.
The problem is something not enough people are speaking intelligently about.
I’m very happy that I stumbled across this during my hunt for
something concerning this.
dewabet alternatif
28 Oct 25 at 11:23 pm