Heim > Backend-Entwicklung > PHP-Tutorial > 使用php标准库spl在实现观察者模式

使用php标准库spl在实现观察者模式

WBOY
Freigeben: 2016-06-23 13:42:37
Original
764 Leute haben es durchsucht

上次使用了纯php实现了一个观察者模式(php观察者模式), 现在使用php标准库spl在次实现观察者模式,好处是:随意的生成您想使用的观察者!

<?php /** * Created by PhpStorm. * User: evolution * Date: 14-12-27 * Time: 下午5:50 */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     * 执行登陆     */    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;    }}/** * 只针对登陆的贯观察者 * Class LoginObserver */abstract class LoginObserver implements SplObserver {    private $login;    function __construct(Login $login){        $this->login = $login;        $login->attach($this);    }    /**     * 对外统一的访问点     * @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{    //不同功能的观察者实现不同的功能    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.'登陆失败,密码错误!');            echo __CLASS__.'用户ip:'.$login->ip.'登陆失败,密码错误!'.'------------------';        }        if($status == Login::LOGIN_USER_UNKNOWN){//            $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');            echo __CLASS__.'用户ip:'.$login->ip.'登陆失败,无此用户!'.'------------------';        }    }}//实例化登陆信息$login = new Login();//实现发邮件观察者new EmailObserver($login);//开始登陆$login->handleLogin();
Nach dem Login kopieren


Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage