observers[] = $observer; } /** * detach an observer * * @param \SplObserver $observer * * @return void */ public function detach(\SplObserver $observer) { $index = array_search($observer, $this->observers); if (false !== $index) { unset($this->observers[$index]); } } /** * 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(); } }