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

php中文网
发布: 2016-06-23 13:42:37
原创
865人浏览过

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

智标领航
智标领航

专注招投标业务流程的AI助手,智能、高效、精准、易用!

智标领航 117
查看详情 智标领航
<?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();
登录后复制


PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号