当前位置:首页 > PHP编程文章 > PHP实现基于状态的责任链审批模式详解

PHP实现基于状态的责任链审批模式知识点总结

  • 发布时间:
  • 作者:码农之家原创
  • 点击:141

这篇文章主要知识点是关于PHP、状态、责任链、审批模式、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下相关资源

PHP基础教程

本书以通俗易懂的语言向初学者介绍了PHP语言的基本概念、使用方法和注意事项。全书通过丰富的示例,引领读者逐步掌握这门流行的Web开发语言,使读者能够上手编写适用于常用场景的PHP脚

查看详情

PHP实现基于状态的责任链审批模式详解

本文实例讲述了PHP实现基于状态的责任链审批模式。分享给大家供大家参考,具体如下:

我们开发网站,除了前后,还有后台,除了内容管理,很多时候要涉及到『审批』。

比如:商务部要做个专题推广活动,活动中需要调用一些商品做优惠。

1、商务部编辑先写文案
2、商务部领导审批文案内容
3、商品部领导需要审批商品的价格和库存(万一没货呢)
4、后面可能还有好多领导要审批(带扩展)

今天我们要引入的模式是『责任链模式』

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来,形成一条链条。请求在这个链条上传递,知道链条上的某一个对象决定处理次请求。发出这个请求的客户端并不知道链条上哪一个对象最终处理这个请求。

为了演示方便,我们做价格设定。

1、假定层级关系是:商品部领导>商务部领导>编辑
2、假设只能一级级审批(也就是不能跳级,仅为了演示方便)
3、这里审批暂时不能回退

PHP实现基于状态的责任链审批模式详解

(上图:演示界面show.php)

show.php:

<?php
  require('subject.php');
  if ($_GET){
    if (isset($_GET['createSubject'])){ //点击创建文案后执行
      $subject = new subject();
      $subject->content = '文案的内容';
      $subject->save();
    }
  }
?>
<html>
  <head>
    <title>责任链-审批</title>
    <style>
      *{marign:0;padding:0}
      .container{width:100%;margin: 0 auto;text-align: center}
    </style>
  </head>
  <body>
    <div class="container">
      <div><h2>流程演示界面</h2></div>
      <form method="get" action="show.php">
        <div class="row">
          <textarea name="" id="" cols="30" rows="10"></textarea>
          <div>
            <button name="createSubject">编辑创建文案</button>
          </div>
        </div>
        <div class="row">
          <hr>
          <button name="step">领导审批</button>
        </div>
      </form>
    </div>
  </body>
</html>

编辑点击『创建文案』提交内容,然后把文案写到到本地json文件(保存)。文案的主题是subject.php:

<?php
class subject
{
  public $content = ''; //文案内容
  public $state = 0; //初试状态
  /**
   * 保存内容(编辑保存)
   */
  public function save(){
    //我们这里保存到本地文件
    file_put_contents(__DIR__.'/subject.json',json_encode($this));
    echo '文案已经创建成功';
  }
}

这个时候文案已经创建好了,需要进入审批

抽象类(领导)manager.php :

<?php
abstract class manager
{
  public $subject; //加载专题内容
  public $mystate=0; //当前状态,这个很重要
  public $leader=false; //重要,设置自己的领导是谁
  public $myname = ''; //当前审批者的名字
  /**
   * 设置领导是谁
   * @param $leader
   */
  public function setLeader($leader)
  {
    $this->leader = $leader; //形成责任链的关键
  }
  public function __construct()
  {
    $str = file_get_contents(__DIR__.'/subject.json');
    $this->subject = json_decode($str);
  }
  public function step($msg)
  {
    //很重要,代表审批
    //只有当subject的state和自己的mystate相等是才会处理
    if ($this->subject->state == $this->mystate){ //代表当前是自己要处理的
      //在这执行审批通过的 具体
      echo $msg . '审批制是:'.$this->myname;
      //判断自己的是否有领导,如果有把控制权交给领导
      if ($this->leader){
        $this->subject->state = $this->leader->mystate; //交控制权
        file_put_contents(__DIR__.'/subject.json',json_encode($this->subject)); //保存状态
      }else{
        echo '审批已经结束';
      }
    }else{
      if ($this->leader){ //leader就是维护整个类的 链
        //让自己的领导去审批
        $this->leader->step($msg);
      }
    }
  }
}

商务部领导,商品部领导,大boss都要继承这个抽象类。

BusinessLeader.php

<?php
class BusinessLeader extends manager
{
  public $myname = '商务部领导';
  public $mystate = 0;
}

ProductLeader.php:

<?php
class ProductLeader extends manager
{
  public $myname = '商品部领导';
  public $mystate = 1;
}

LastLeader.php

<?php
class LastLeader extends manager
{
  public $myname = '终极领导';
  public $mystate = 2;
}

在编辑提交文案之后,会进入『领导审批』阶段:

if (isset($_GET['step'])){ //进入领导审批阶段了
  //这里面最关键是
   //1.确定第一个领导是谁
   //2. 要维护各个领导直接的关系,
   require ('manager.php');
   require ('BusinessLeader.php');
   require ('ProductLeader.php');
   require ('LastLeader.php');
   $businessLeader = new BusinessLeader();
   $productLeader = new ProductLeader();
   $lastLeader = new LastLeader();
   //下面还是维护关系
   $businessLeader->setLeader($productLeader);
   $productLeader->setLeader($lastLeader);
   $businessLeader->step('审批通过');
}

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

以上就是本次给大家分享的关于PHP的全部知识点内容总结,大家还可以在下方相关文章里找到thinkphp5框架实现的自定义、 php封装单文件路径上传到、 用Zend Framework框架实现Go、 等php文章进一步学习,感谢大家的阅读和支持。

上一篇:Laravel创建Zip压缩文件下载的实例方法

下一篇:如何实现Laravel的服务容器的实例方法

展开 +

收起 -

相关内容
PHP5权威编程

《PHP5权威编程》一书为大家全面介绍了PHP 5中的新功能、面向对象编程方法及设计模式,还分析阐述了PHP 5中新的数据库连接处理、错误处理和XML处理等机制。希望能够帮助读者系统了解、熟练掌握PHP,大程度地挖掘PHP的潜力,以更低的成本搭建更加稳健、高效的PHP应用。

查看详情
Learning PHP设计模式

本书是PHP设计模式的经典教程,让读者掌握更精巧的编程风格。本书利用大量浅显易懂的例子告诉你如何应用多种面向对象模式,并展示了这些模式在一些成熟的实际项目中的具体应用,欢迎免费下载

查看详情
PHP开发实例大全:提高卷

《PHP开发实例大全(提高卷)》600经典实例及源码分析 25个应用方向 两卷共1225例 40个方向 分门别类实例一应俱全 供学习、速查、实践练习的超全参考手册 php开发实战1200例 php范例大全 之全新

查看详情
ThinkPHP实战

《ThinkPHP实战》实战性很强,没有冗长的概念讲解,都是实际项目中使用的实用技术,比如验证码、文件上传、图像处理、调试、安全、缓存等。留言板、博客、论坛、微信公众平台开发4个实战项目案例,使读者尽快切入ThinkPHP企业级项目开发。

查看详情
PHP&MySQL跨设备网站开发实例精粹

这本书从易学实用的角度详细讲解了PHP、HTML5语法,MySQL数据库存取,网页之间的信息传递、表单的后端处理等,提供了丰富的网站开发范例,欢迎下载

查看详情
PHP与MySQL高性能应用开发

PHP与MySQL高性能应用开发书中不仅讲解了OOP、设计模式,也讲解了如何进行性能优化和调试。甚至,还对于语言之外的代码重构进行了讲解,本书面向的对象是有一定PHP基础,但是又想深入学习的PHP开发者,欢迎免费下载

查看详情
高性能PHP7

《高性能PHP 7》通俗易懂且图文并茂,实践案例丰富,相信一定能吸引大家阅读。全书目标清晰,始终围绕着如何使用PHP及周边技术来优化性能这一主题,能够为许多工程师解决实际问题。

查看详情
写给PHP开发者的Node.js学习指南

Node.js是一套用来编写高性能网络服务器的JavaScript工具包。结合PHP和Node.js,我们可以概览整个Web服务器从起源到现在的历史过程以及其中的改变。 《 写给PHP开发者的Node.js学习指南 》的目的是

查看详情
PHP+MySQL程序设计及项目开发 查看详情
学习笔记
网友NO.724923

PHP三种方式实现链式操作详解

在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是: strlen(trim($str)) 如果要实现类似js中的链式操作,比如像下面这样应该怎么写? $str-trim()-strlen() 下面分别用三种方式来实现: 方法一、使用魔法函数__call结合call_user_func来实现 思想:首先定义一个字符串类StringHelper,构造函数直接赋值value,然后链式调用trim()和strlen()函数,通过在调用的魔法函数__call()中使用call_user_func来处理调用关系,实现如下: ?phpclass StringHelper { private $value; function __construct($value) { $this-value = $value; } function __call($function, $args){ $this-value = call_user_func($function, $this-value, $args[0]); return $this; } function strlen() { return strlen($this-value); }}$str = new StringHelper(" sd f 0");echo $str-trim('0')-strlen(); 终端执行脚本: php test.php 8 方法二、使用魔法函数__call结合call_user_……

网友NO.527194

PHP简单数据库操作类实例【支持增删改查及链式操作】

本文实例讲述了PHP简单数据库操作类。分享给大家供大家参考,具体如下: 在进行项目开发时,数据库是必不可少的东西了。但是很多时候却又对数据库SQL语句的繁杂而感到头疼。提供一个我自己使用的数据库操作类(模型Model),供大家使用。支持增、删、改、查,支持链式操作,代码不到100行,非常小巧方便,很适合小项目的快速部署使用。 /**** @Authot: summer** @E-mail: wenghang1228@me.com** @Data: 2015-02-06** @Project: 数据库操作类Model** @Version:1.0** @版权所有:夏天的风————记录夏天对技术的追求与生活的热爱** @网址: http://www.xtwind.com**/class Model{ public $field; public $tabname; public $where; public $order; public $limit; //构造函数,链接数据库,给表赋值 function __construct($tabname){ mysql_connect(HOST,USER,PASSWORD); mysql_select_db(DBNAME); mysql_query("set names utf8"); $this-tabname=$tabname; } //组……

网友NO.898595

php如何控制用户对图片的访问 PHP禁止图片盗链

把images目录设置成不充许http访问(把图片目录的:读取、目录浏览 两个权限去掉)。 用一个PHP文件,直接用file函数读取这个图片。在这个PHP文件里进行权限控制。 apache环境中,在你的图片目录中加上下面这个文件即可。 文件名 .htaccess 文件内容如下 # options the .htaccess files in directories can override. # Edit apache/conf/httpd.conf to AllowOverride in .htaccess # AllowOverride AuthConfig # Stop the directory list from being shown Options -Indexes # Controls who can get stuff from this server. Order Deny,Allow Deny from all Allow from localhost 其他web环境如iss,nginx也类似。 class imgdata{public $imgsrc;public $imgdata;public $imgform;public function getdir($source){$this-imgsrc = $source;}public function img2data(){$this-_imgfrom($this-imgsrc);return $this-imgdata=fread(fopen($this-imgsrc,'rb'),filesize($this-imgsrc));}public function data2img(){header(“content-type:$this-imgform”);ec……

网友NO.584592

php链式操作的实现方式分析

本文实例讲述了php链式操作的实现方式。分享给大家供大家参考,具体如下: 类似 $db-where("id=1")-limit("5")-order("id desc") ,链式操作的实现方式 先讲下方法的常规调用; namespace Com;class Database{ function where($where){ echo $where; } function order($order){ echo $order; } function limit($limit){ echo $limit; }} 调用 $db = new \Com\Database();$db-where();$db-limit(); 缺点:实现多个方法需要多行调用; 链式操作,在方法返回 return $this; 即可使用链式操作; namespace Com;class Database{ function where($where){ echo $where; return $this; } function order($order){ echo $order; return $this; } function limit($limit){ echo $limit; return $this; }} 使用链式调用: $db = new \Com\Database();$db-where("id=1")-limit("5")-order("id desc"); 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本……

<
1
>

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757