欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP使用标准库spl实现的观察者模式示例

程序员文章站 2022-03-09 21:45:33
本文实例讲述了php使用标准库spl实现的观察者模式。分享给大家供大家参考,具体如下: 前面使用纯php实现了一个观察者模式(), 现在使用php标准库spl在次实现观察...

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

前面使用纯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程序设计有所帮助。