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

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

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

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

PHP基础教程
  • 类型:PHP教程大小:25.3 MB格式:PDF出版:人民邮电出版社作者:厄尔曼 著,贾菡
立即下载

更多PHP相关的学习资源可以参阅 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的全部知识点内容总结,大家还可以在下方相关文章里找到ThinkPHP框架整合微信支付、 PHP提交表单后获取提交内、 《PHP从入门到精通》基础、 等php文章进一步学习,感谢大家的阅读和支持。

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

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

展开 +

收起 -

学习笔记
网友NO.194729

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_func_array来实现 ?phpclass StringHelper { private $value; function __construct($value) { $this-value = $value; } function __call($function, $args){ array_unshift($args, $this-value); $this-value = call_user_func_array($function, $args); return $this; } function strlen() { return strlen($this-value); }}$str = new StringHelper(" sd f 0");echo $str-trim('0')-strlen(); 说明: array_unshift(array,value1,value2,value3...) array_unshift() 函数用于向数组插入新元素。新数组的值将被……

网友NO.134854

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; } //组合字段 function field($field){ $this-$field=$field; return $this; } //组合where条件 function where($where){ $this-where="where ".$where; return $this; } //组合order排序条件 function order($order){ $this-order="order by ".$order; return $this; } //组合limit限制条数 function limit($limit){ $this-limit="limit ".$limit; return $this; } //组合和执行select语句 function select($all=""){ if ($all) { $sql="select {$all} from {$this-tabname} order by id"; }else{ $sql="select {$……

网友NO.849377

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”);echo $this-imgdata;//echo $this-imgform;//imagecreatefromstring($this-imgdata);}public function _imgfrom($imgsrc){$info=getimagesize($imgsrc);//var_dump($info);return $this-imgform = $info['mime'];}}$n = new imgdata;$n - getdir(“1.jpg”); //图片路径,一般存储在数据库里,用户无法获取真实路径,可根据图片ID来获取$n - img2data();$n - data2img(); 这段代码是读取图片,然后直接输出给浏览器,在读取和输出之前,进行用户权限判断。 这里说……

网友NO.800598

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基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助。 ……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明