您好,登錄后才能下訂單哦!
怎么在PHP中利用spl實(shí)現(xiàn)一個(gè)觀察者模式?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
<?php class Login implements SplSubject { private $storage; public $status; public $ip; const LOGIN_ACCESS = 1; const LOGIN_WRONG_PASS = 2; const LOGIN_USER_UNKNOWN = 3; function __construct(){ $this->storage = new SplObjectStorage(); } function attach (SplObserver $observer) { $this->storage->attach($observer); } function detach(SplObserver $observer){ $this->storage->detach($observer); } function notify(){ foreach ($this->storage as $obs) { $obs->update($this); } } /** * @author jichao.wang * 執(zhí)行登陸 */ function handleLogin() { $ip = rand(1,100); switch (rand(1, 3)) { case 1: $this->setStatus(self::LOGIN_ACCESS, $ip); $ret = true; break; case 2: $this->setStatus(self::LOGIN_WRONG_PASS, $ip); $ret = false; break; case 3: $this->setStatus(self::LOGIN_USER_UNKNOWN, $ip); $ret = false; break; } /** * handle event */ $this->notify(); return $ret; } /** * @param $status * @author jichao.wang * set login status */ function setStatus($status,$ip) { $this->status = $status; $this->ip = $ip; } /** * @return mixed * @author jichao.wang * get login status */ function getStatus() { return $this->status; } } /** * 只針對(duì)登陸的貫觀察者 * Class LoginObserver */ abstract class LoginObserver implements SplObserver { private $login; function __construct(Login $login){ $this->login = $login; $login->attach($this); } /** * 對(duì)外統(tǒng)一的訪問(wèn)點(diǎn) * @param SplSubject $subject */ function update( SplSubject $subject ){ if($subject === $this->login){ $this->doUpdate($subject); } } abstract function doUpdate( Login $login ); } /** * Class EmailObserver */ class EmailObserver extends LoginObserver{ //不同功能的觀察者實(shí)現(xiàn)不同的功能 function doUpdate( Login $login ){ $status = $login->getStatus(); if($status == Login::LOGIN_ACCESS){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸成功!'); echo __CLASS__.'用戶ip:'.$login->ip.'登陸成功!'.'------------------'; } if($status == Login::LOGIN_WRONG_PASS){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'); echo __CLASS__.'用戶ip:'.$login->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------'; } if($status == Login::LOGIN_USER_UNKNOWN){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無(wú)此用戶!'); echo __CLASS__.'用戶ip:'.$login->ip.'登陸失敗,無(wú)此用戶!'.'------------------'; } } } //實(shí)例化登陸信息 $login = new Login(); //實(shí)現(xiàn)發(fā)郵件觀察者 new EmailObserver($login); //開(kāi)始登陸 $login->handleLogin();
關(guān)于怎么在PHP中利用spl實(shí)現(xiàn)一個(gè)觀察者模式問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。