GitHub Address: Https://github.com/ZQCard/design_pattern
/**/
(1) Subject.class.php (target Class)
<?phpnamespace Observer;classsubject{Private $state; Private $observers= []; Public functiongetState () {return $this-State ; } Public functionSestate ($state) { $this->state =$state; $this-notifyallobjects (); } Public functionRegister (Observer$object) { $this->observers[] =$object; } Public functionRemove$object) { foreach($this->observers as $key=$observer) { if($observer==$object){ unset($this->observers[$key]); } } } Public functionnotifyallobjects () {foreach($this->observers as $observer) { $observer-update (); } }}
(2) OBSERVER.CLASS.PHP (Observer abstract parent class)
<? phpnamespace Observer; Abstract class observer{ protected$subject; Public Abstract function update ();}
(3) ObjectA.class.php (Concrete abstract Class A)
<?phpnamespace Observer;classObserveraextendsobserver{Private $myState= ' init A '; Public function__construct (Subject$subject) { $this->subject =$subject; $this->subject->register ($this); } Public functionUpdate () {$this->mystate =$this->subject->getState (); } Public functiongetsate () {return"Observera Get state:".$this-MyState; }}
(4) ObserverB.class.php (specific observer B)
<?phpnamespace Observer;classObserverbextendsobserver{Private $myState= ' init B '; Public function__construct (Subject$subject) { $this->subject =$subject; $this->subject->register ($this); } Public functionUpdate () {$this->mystate =$this->subject->getState (); } Public functiongetsate () {return"Observerb Get state:".$this-MyState; }}
(5) observer.php
<? phpspl_autoload_register (function ($className) { $className Str_replace(' \ \ ', '/',$className) ; include $className. ". Class.php ";}); Use Observer\observera; Use Observer\observerb; Use observer\subject;/*
Observera Get State:init A
Observerb Get State:init B
Observera Get State:hello
Observerb Get State:hello
*/
$subject=NewSubject ();$objectA=NewObservera ($subject); $objectB=NewObserverb ($subject); Echo $objectA-getsate ();Echo' <br/> '; Echo $objectB-getsate ();Echo' <br/> '; $subject->sestate ("Hello"); Echo $objectA-getsate ();Echo' <br/> '; Echo $objectB-getsate ();Echo' <br/> ';
Observer pattern for Design patterns (PHP implementation)