当前位置:首页>php>[PHP]设计模式 四

[PHP]设计模式 四

  • 2026-09-10 07:17:40
[PHP]设计模式 四

PHP设计模式 四

4 观察者模式 SplSubject&SplObserver

观察者模式详解:

PHP设计模式(三) 观察者模式

SplSubject和SplObserver是系统自带的方法,用于观察者模式实现。

代码实现

基础类

classBaseEventimplementsSqlSubject{protected $observers;protected $name;publicfunction__construct($name){$this->name = $name;    }//增加观察者publicfunctionattach(\SplObserver $observer){$this->observers[] = $observer;    }//减少观察者publicfunctiondetach(\SplObserver $observer){        $key = array_search($observer,$this->observers, true);if($key){unset($this->observers[$key]);        }    }//通知观察者publicfunctionnotify(){foreach ($this->observers as $value) {            $value->update($this);        }    }}

接口相关类

classLoginextendsController{//短信登录 控制层publicfunctionsmslogin(){        $param = request()->getParam();        $l_login = new loginlogic();        $result = $l_login->smslogin($param);        response()->send($result);    }}classloginlogic{//短信登录 逻辑层publicfunctionsmslogin($array){        $phone = $arr['phone'];        $pwd = $arr['pwd'];        $s_user_login = new UserLoginServer("user_login");        $s_user_login->attach(new SmsLoginObserver());        $s_user_login->attach(new UserExpLoginObserver());        $userinfo = $s_user_login->dologin($phone,$pwd);returnnew Reaponse(1,'登录成功',$userinfo);    }}

服务类

//短信登录 服务层classUserLoginServerextendsBaseEvent{private $userinfo;publicfunctiondologin(string $phone,string $pwd){$this->phone = $phone//to do 登录逻辑 获取用户信息       $userinfo = $this->getUserinfo($phone,$pwd);$this->notify();return$this->userinfo;    }publicfunctiongetuserinfo(){return$this->userinfo;    }}

监听类

classSmsLoginObserverimplementsSplObserver{//登录成功后发送短信publicfunctionupdate(\SplSubject $subject){         $userinfo = $subject->getuserinfo();         $userid = $userinfo['id'];         $phone = $userinfo['phone'];         $name = $userinfo['name'];         $login_ip = $userinfo['login_ip'];         $last_login_time = $userinfo['last_login_time'];         $s_sms = new SmsServer();         $content = $this->getconent($name,$login_ip,$last_login_time);         $s_sms->send($phone,$content);         Log::info("用户[".$userid."]登录成功,发短信到".$phone) ;     }//获取短信发送内容privatefunctiongetconent($name,$login_ip,$last_login_time){         $conent = $name." ".$login_ip." ".$last_login_time;return $conent;     }}classUserExpLoginObserverimplementsSplObserver{//登录成功后增加积分publicfunctionupdate(\SplSubject $subject){         $userinfo = $subject->getuserinfo();         $userid = $userinfo['id'];         $num =1;$this->addexp($userid,$num);         Log::info("增加用户[".$userid."]积分".$num) ;     }}

SplSubject

官方文档

https://www.php.net/manual/zh/class.splsubject.php

SplObserver

官方文档

https://www.php.net/manual/zh/class.splobserver.php

扫描识别二维码关注我们获取更多

最新文章

随机文章