Maison > développement back-end > tutoriel php > 使用php标准库spl在实现观察者模式

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

WBOY
Libérer: 2016-06-23 13:42:37
original
764 Les gens l'ont consulté

上次使用了纯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();
Copier après la connexion


source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal