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

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

前面使用纯php实现了一个观察者模式(php观察者模式), 现在使用php标准库spl在次实现观察者模式,好处是:随意的生成您想使用的观察者!

/**

* 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程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会

转载自 深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会自定义标签,顾名思义,就是自己定义的标签。那么我们为什么要自己定义一些标签呢? 我们知道,如果要在JSP中获取数据我们可以采用通过JSP的隐式对象request来…

ps查看所有php进程,ps命令就是最基本进程查看命令

1、ps是什么?要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,ps命令就是最基本进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等…

如何测试微信应用号

每一次微信的动作都是商机,而随着微信应用号的即将面世,微信应用号的开发和测试又会成为一股新的风向。 其实经常有人问到微信服务号或者微信订阅号怎么测试的相关内容,可能总觉得比较缺乏技术含量不太想说,这次看了下应用号&…

git 拉代码

git clone 。。 拉取代码master git clone -b 分支名 。。。 拉取分支名 git——更新分支、提交代码、切换分支、合并分支 还是直接贴教程吧:https://git-scm.com/book/zh/v2 如何把本地idea上的项目上传到github上:https://www.cnblogs.com/…

javaweb学习总结(二十四)——jsp传统标签开发

转载自 javaweb学习总结(二十四)——jsp传统标签开发一、标签技术的API 1.1、标签技术的API类继承关系二、标签API简单介绍 2.1、JspTag接口JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属性和方法。JspTag接口有Tag…

二级导航 sql php,帝国cms栏目导航调用之SQL语句调用一级栏目和二级栏目的方法...

帝国cms调用一级栏目及下面的二级栏目调用方法如下&#xff1a;SQL语句<?php $ecms_bq_sqlsys_ReturnEcmsLoopBq("select * from [!db.pre!]enewsclass where bclassid0 order by myorder limit 6",14,24,0);$bqno0;while($bqr$empire->fetch($ecms_bq_sql)){…

Java开发利器:IntelliJ IDEA的安装、配置与使用

1.尚硅谷-IDEA-IntelliJ IDEA的介绍和优势 2.尚硅谷-IDEA-版本介绍与安装前的准备 3.尚硅谷-IDEA-IDEA的卸载 4.尚硅谷-IDEA-IDEA的安装 5.尚硅谷-IDEA-安装目录和设置目录结构的说明 6.尚硅谷-IDEA-启动IDEA并执行HelloWorld 7.尚硅谷-IDEA-Module的使用 8.尚硅谷-IDEA…

开发者的利器:Docker 理解与使用

困扰写代码的机器难免会被我们安装上各种各样的开发工具、语言运行环境和引用库等一大堆的东西&#xff0c;长久以来不仅机器乱七八糟&#xff0c;而且有些相同的软件还有可能会安装不同的版本&#xff0c;这样又会导致一个项目正常运行了&#xff0c;却不小心破坏了另一个项目…

php环境搭建sqlserver,ThinkPHP5.0/5.1对接SQLServer数据库(宝塔环境)

SQLServer实际上是mssql&#xff0c;想要使用thinkphp的Db对象操作数据库前必须要在服务器上安装对应的扩展。宝塔面板的PHP安装路径为/www/server/php/ 且支持多个PHP版本共存&#xff0c;所以安装PHP扩展的方法与网上那些示例略有不同。下面是 PHP7.2 安装 pdo_sqlsrv5.6.0 扩…

<c:set>标签

转载自 <c:set> 标签 JSP 标准标签库 <c:set>标签用于设置变量值和对象属性。 <c:set>标签就是<jsp:setProperty>行为标签的孪生兄弟。 这个标签之所以很有用呢&#xff0c;是因为它会计算表达式的值&#xff0c;然后使用计算结果来设置 JavaBean 对…

layUI 日期组件单独使用 并且放大

日期类型 选择 layuI 的date 类型单独使用 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet" href"/layui/css/layui.css" media"all…

Opserver开源的服务器监控系统(ASP.NET)

Opserver是Stack Exchange下的一个开源监控系统,系统本身由C#语言开发的ASP.NET&#xff08;MVC&#xff09;应用程序&#xff0c;无需任何复杂的应用配置&#xff0c;入门很快。下载地址&#xff1a;https://github.com/opserver/Opserver。据说&#xff0c;国内腾讯公司内部也…

jsp页面中JSTL/EL标签引用java后台静态static字段的方法总结

转载自 jsp页面中JSTL/EL标签引用java后台静态static字段的方法总结为什么使用该功能&#xff1f;项目中的每个页面都包含产品名称、Logo、版本等信息&#xff0c;我希望修改一处&#xff0c;其它所有的全部跟着变。 有同学会说那就都引用一个页面“”就Ok了&#xff1b;但是…

c 管理信息系统mysql,输入数据并输出信息的系统都称为()。A、信息系统B、数据库系统C、事务处理系统D、管理信息系统...

关于葡萄糖重吸收的叙述&#xff0c;错误的是()。A.只有近球小管可以重吸收B.与Na&#xff0b;的重吸收相耦联C.是一种主肌力评定时错误的做法是A、应使患者配合B、患者应适当去除衣物C、应检查涉及的所有关节D、应增加协同当使用竹笆脚手板时&#xff0c;纵向水平杆与横向水平…

一位跨平台开发者的自白

Andreia Gaita[1] 在 OSCON 开源大会上发表了一个题为跨平台开发者的自白[2]的演讲。她长期从事于开源工作&#xff0c;并且为Mono[3] 工程&#xff08;LCTT 译注&#xff1a;一个致力于开创 .NET 在 Linux 上使用的开源工程&#xff09;做着贡献&#xff0c;主要以 C#/C 开发。…

JS (intermediate value).Format is not a function问题解决

JS (intermediate value).Format is not a function问题解决 前言 最近项目遇到一个问题&#xff0c;就是在javascript中使用new Date().Format("YYYY-mm-dd")的时候&#xff0c;会出现报错现象&#xff0c;直接导致界面无法正常显示。下面为大家解答一下。 问题详情…

java程序大笨钟怎么打,L1-018.大笨鍾(Java)PAT團體程序設計天梯賽-練習集

微博上有個自稱“大笨鍾V”的家伙&#xff0c;每天敲鍾催促碼農們愛惜身體早點睡覺。不過由於笨鍾自己作息也不是很規律&#xff0c;所以敲鍾並不定時。一般敲鍾的點數是根據敲鍾時間而定的&#xff0c;如果正好在某個整點敲&#xff0c;那么“當”數就等於那個整點數&#xff…

JSP JavaBean

转载自 JSP JavaBeanJSP JavaBean JavaBean是特殊的Java类&#xff0c;使用J ava语言书写&#xff0c;并且遵守JavaBean API规范。 接下来给出的是JavaBean与其它Java类相比而言独一无二的特征&#xff1a; 提供一个默认的无参构造函数。需要被序列化并且实现了Serializable接…

layui 单独使用日期组件

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet" href"/layui/css/layui.css" media"all"><style type"text/css"…

JSP中的EL表达式详细介绍

转载自 JSP中的EL表达式详细介绍一、JSP EL语言定义EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种…