Home > Backend Development > PHP Tutorial > 使用php标准库spl在实现观察者模式

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

WBOY
Release: 2016-06-23 13:42:37
Original
767 people have browsed it

上次使用了纯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();
Copy after login


source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template