observers = new \SplObjectStorage(); } /** * attach a new observer. * * @param \SplObserver $observer * * @return void */ public function attach(\SplObserver $observer) { $this->observers->attach($observer); } /** * detach an observer. * * @param \SplObserver $observer * * @return void */ public function detach(\SplObserver $observer) { $this->observers->detach($observer); } /** * notify observers. * * @return void */ public function notify() { /** @var \SplObserver $observer */ foreach ($this->observers as $observer) { $observer->update($this); } } /** * Ideally one would better write setter/getter for all valid attributes and only call notify() * on attributes that matter when changed. * * @param string $name * @param mixed $value * * @return void */ public function __set($name, $value) { $this->data[$name] = $value; // notify the observers, that user has been updated $this->notify(); } }