• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP使用标准库spl实现的观察者模式示例
    POST TIME:2021-10-18 04:55

    本文实例讲述了PHP使用标准库spl实现的观察者模式。分享给大家供大家参考,具体如下:

    前面使用纯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();
    
    

    运行结果:

    EmailObserver用户ip:77登陆成功!------------------

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
    • PHP SPL标准库之数据结构栈(SplStack)介绍
    • PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
    • 解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
    • PHP SPL标准库之SplFixedArray使用实例
    • PHP标准库(PHP SPL)详解
    • PHP SPL标准库中的常用函数介绍
    • PHP SPL标准库之接口(Interface)详解
    • PHP标准库 (SPL)——Countable用法示例
    上一篇:PHP设计模式之观察者模式定义与用法示例
    下一篇:PHP常用字符串函数小结(推荐)
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信