<?php interface Message { static function getType(); }; interface Observer { function notifyMsg(Message $msg); }; class Subject { private $observers = Array(); public function registerObserver(Observer $observer, $msgType) { $this->observers[$msgType][] = $observer; // wyh? } private function notifyMsg(Message $msg) { @$observers = $this->observers[$msg->getType()]; if (!$observers) { return; } foreach ($observers as $observer) { $observer->notifyMsg($msg); } } public function someMethod() { sleep(1); $this->notifyMsg(new HelloMessage("Michael")); } } class HelloMessage implements Message { private $name; public function __construct($name) { $this->name = $name; } public function getMsg() { return "Hello,$this->name!"; } static function getType() { return "HELLO_TYPE"; } } class SubObserver implements Observer { public function notifyMsg(Message $msg) { if ($msg instanceof HelloMessage) { echo $msg->getMsg(); } } } $subject = new Subject(); $observer = new SubObserver(); $subject->registerObserver($observer, HelloMessage::getType()); $subject->someMethod(); ?>