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

PHP設計模式之觀察者模式定義與用法示例

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

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

<?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.'登陸失敗,密碼錯誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯誤!'.'------------------';
    }
    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.'登陸失敗,密碼錯誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯誤!'.'------------------';
    }
    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.'登陸失敗,密碼錯誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯誤!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無此用戶!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'.'------------------';
    }
  }
}
//實例化登陸信息
$login = new Login();
//實現(xiàn)發(fā)郵件觀察者
$login->attach(new EmailObserver());
//實現(xiàn)發(fā)驗證碼觀察者
$login->attach(new PhoneObserver());
//實現(xiàn)其他觀察者
$login->attach(new AbcObserver());
//開始登陸
$login->handleLogin();
?>

運行結果:

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

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家PHP程序設計有所幫助。

相關文章

  • php計算兩個文件相對路徑的方法

    php計算兩個文件相對路徑的方法

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

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

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

    Docker 安裝 PHP并與Nginx的部署實例講解

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

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

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

    php遠程下載類分享

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

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

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

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

    PHP中共有超過30個新的數(shù)組相關函數(shù),其中很多通用函數(shù)允許您檢查給定數(shù)組中是否存在特定對象、對數(shù)組元素計數(shù)、增加或刪除元素,或對元素排序。
    2011-08-08
  • PHP版自動生成文章摘要

    PHP版自動生成文章摘要

    現(xiàn)內容:截斷一段含有HTML代碼的文本,但是不會出現(xiàn)圍堵標記沒有封閉的問題。說明:這是PHP版的,用于在服務器端使用,如果你需要一個客戶端版的,請閱讀
    2008-07-07
  • 基于php數(shù)組中的索引數(shù)組和關聯(lián)數(shù)組詳解

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

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

    php過濾器使用詳解

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

最新評論

大竹县| 根河市| 含山县| 黄浦区| 界首市| 克拉玛依市| 固阳县| 长沙市| 南昌市| 惠来县| 垣曲县| 洮南市| 兴化市| 嘉祥县| 台东市| 宁阳县| 苍南县| 霍林郭勒市| 绵阳市| 尉犁县| 肇东市| 康平县| 东光县| 青田县| 安义县| 屏东市| 达州市| 铜鼓县| 澜沧| 紫云| 荆州市| 蓝山县| 黑龙江省| 和静县| 松溪县| 磴口县| 香格里拉县| 杂多县| 常州市| 重庆市| 上虞市|