最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP設(shè)計(jì)模式之觀察者模式定義與用法示例

 更新時(shí)間:2018年08月04日 11:36:46   作者:coder_up  
這篇文章主要介紹了PHP設(shè)計(jì)模式之觀察者模式定義與用法,結(jié)合實(shí)例形式分析了php觀察者模式的具體定義及相關(guān)使用操作技巧,需要的朋友可以參考下

本文實(shí)例講述了PHP設(shè)計(jì)模式之觀察者模式定義與用法。分享給大家供大家參考,具體如下:

<?php
/**
 * Interface Observable
 * define a observable interface
 * @author jichao.wang
 */
interface Observable
{
  function attach(Observer $observer);
  function detach(Observer $observer);
  function notify();
}
/**
 * Class Login
 * @author jichao.wang
 */
class Login implements Observable
{
  private $observers;
  public $status;
  public $ip;
  const LOGIN_ACCESS = 1;
  const LOGIN_WRONG_PASS = 2;
  const LOGIN_USER_UNKNOWN = 3;
  function __construct()
  {
    $this->observers = array();
  }
  /**
   * @param Observer $observer
   * @author jichao.wang
   * attach a observer
   */
  function attach(Observer $observer)
  {
    $this->observers[] = $observer;
  }
  /**
   * @param Observer $observer
   * @author jichao.wang
   * detach a observer
   */
  function detach(Observer $observer)
  {
    $newObservers = array();
    foreach ($this->observers as $key => $obs) {
      if ($obs !== $observer) {
        $newObservers[] = $obs;
      }
    }
    $this->observers = $newObservers;
  }
  /**
   * @author jichao.wang
   * handle observer notify
   */
  function notify()
  {
    foreach ($this->observers as $obs) {
      $obs->update($this);
    }
  }
  /**
   * @author jichao.wang
   * 執(zhí)行登陸
   */
  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;
  }
}
/**
 * Interface Observer
 * @author jichao.wang
 */
interface Observer {
  function update(Observable $observable);
}
/**
 * Class EmailObserver
 * @author jichao.wang
 */
class EmailObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸成功!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無此用戶!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'.'------------------';
    }
  }
}
/**
 * Class PhoneObserver
 * @author jichao.wang
 */
class PhoneObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸成功!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無此用戶!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'.'------------------';
    }
  }
}
class AbcObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸成功!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無此用戶!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'.'------------------';
    }
  }
}
//實(shí)例化登陸信息
$login = new Login();
//實(shí)現(xiàn)發(fā)郵件觀察者
$login->attach(new EmailObserver());
//實(shí)現(xiàn)發(fā)驗(yàn)證碼觀察者
$login->attach(new PhoneObserver());
//實(shí)現(xiàn)其他觀察者
$login->attach(new AbcObserver());
//開始登陸
$login->handleLogin();
?>

運(yùn)行結(jié)果:

EmailObserver用戶ip:41登陸失敗,無此用戶!------------------PhoneObserver用戶ip:41登陸失敗,無此用戶!------------------AbcObserver用戶ip:41登陸失敗,無此用戶!------------------

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • php計(jì)算兩個(gè)文件相對路徑的方法

    php計(jì)算兩個(gè)文件相對路徑的方法

    這篇文章主要介紹了php計(jì)算兩個(gè)文件相對路徑的方法,涉及php操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • PHP保存Base64圖片base64_decode的問題整理

    PHP保存Base64圖片base64_decode的問題整理

    在本篇文章里小編給大家整理的是關(guān)于PHP保存Base64圖片base64_decode的問題,需要的朋友們參考下。
    2019-11-11
  • Docker 安裝 PHP并與Nginx的部署實(shí)例講解

    Docker 安裝 PHP并與Nginx的部署實(shí)例講解

    這篇文章主要介紹了Docker 安裝 PHP并與Nginx的部署實(shí)例講解,文中圖文操作步驟講解的很清楚,有感興趣的同學(xué)可以研究下
    2021-02-02
  • PHP Parse Error: syntax error, unexpected $end 錯(cuò)誤的解決辦法

    PHP Parse Error: syntax error, unexpected $end 錯(cuò)誤的解決辦法

    今天幫客戶配置服務(wù)器,訪問php的時(shí)候提示PHP Parse Error: syntax error, unexpected $end 錯(cuò)誤,通過查找找到了問題,特分享下
    2012-06-06
  • php遠(yuǎn)程下載類分享

    php遠(yuǎn)程下載類分享

    這篇文章主要為大家分享了php遠(yuǎn)程下載類,用戶可以將下載文件到主機(jī),感興趣的小伙伴們可以參考一下
    2016-04-04
  • PHP中開啟gzip壓縮的2種方法

    PHP中開啟gzip壓縮的2種方法

    這篇文章主要介紹了PHP中開啟gzip壓縮的2種方法,本文介紹了php配置文件與開啟方法、php文件開啟方法,需要的朋友可以參考下
    2015-01-01
  • PHP數(shù)組實(shí)例總結(jié)與說明

    PHP數(shù)組實(shí)例總結(jié)與說明

    PHP中共有超過30個(gè)新的數(shù)組相關(guān)函數(shù),其中很多通用函數(shù)允許您檢查給定數(shù)組中是否存在特定對象、對數(shù)組元素計(jì)數(shù)、增加或刪除元素,或?qū)υ嘏判颉?
    2011-08-08
  • PHP版自動生成文章摘要

    PHP版自動生成文章摘要

    現(xiàn)內(nèi)容:截?cái)嘁欢魏蠬TML代碼的文本,但是不會出現(xiàn)圍堵標(biāo)記沒有封閉的問題。說明:這是PHP版的,用于在服務(wù)器端使用,如果你需要一個(gè)客戶端版的,請閱讀
    2008-07-07
  • 基于php數(shù)組中的索引數(shù)組和關(guān)聯(lián)數(shù)組詳解

    基于php數(shù)組中的索引數(shù)組和關(guān)聯(lián)數(shù)組詳解

    下面小編就為大家分享一篇基于php數(shù)組中的索引數(shù)組和關(guān)聯(lián)數(shù)組詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • php過濾器使用詳解

    php過濾器使用詳解

    PHP 過濾器用于驗(yàn)證和清理外部輸入。PHP 過濾器擴(kuò)展具有檢查用戶輸入所需的許多功能,旨在使數(shù)據(jù)驗(yàn)證更容易、更快
    2022-11-11

最新評論

贵港市| 边坝县| 平邑县| 洛隆县| 洮南市| 牡丹江市| 星座| 新津县| 科尔| 逊克县| 顺昌县| 烟台市| 耒阳市| 金平| 青铜峡市| 仪陇县| 福贡县| 神农架林区| 紫云| 杭州市| 凌海市| 镶黄旗| 庆阳市| 七台河市| 鹤岗市| 顺义区| 彝良县| 盐津县| 东台市| 庆阳市| 长垣县| 安远县| 天气| 齐河县| 迁西县| 安陆市| 汨罗市| 三明市| 莫力| 富裕县| 广丰县|