PHP面向对象之事务脚本模式(详解)


Posted in PHP onJune 07, 2017

如下所示:

/*
事务脚本模式: 类似于thinkphp中的model层,或者说就是操作数据库的类。
个人觉得实践中使用起来还是挺简单方便的,就是SQL语句写死了的话,灵活性就不够。
示例代码如下:

*/

namespace woo\process;

abstract class Base{
  static $DB;         //pdo对象
  static $stmts = array(); //sql语句句柄
  
  function __construct (){
    $dsn = \woo\base\ApplicationRegistry::getDSN();
    if(is_null($dsn)){
      throw new \woo\base\AppException("No DSN");
    }
    self::$DB = new PDO($dsn);
    self::$DB->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
  }
  
  function prepareStatement($stmt_s){  //缓存sql语句句柄
    if(isset(self::$stmts($stmt_s)){
      return self::$stmts[$stmt_s];
    }
    $stmt_handle = self::$DB->prepare($stmt_s);
    self::$stmts[$stmt_s] = $stmt_handle;
    return $stmt_handle;
  }
  
  protected function doStatement($stmt_s,$values_a){  //执行sql并获取一个语句资源
    $sth = $this->prepareStatement($stmt_s);
    $sth->closeCursor();
    $db_result = $sth->execute($values_a);
    return $sth;
  }
}

//这个类就是向数据库中写入一些数据,比较简单没什么好多说的
class VenueManager extends Base{
  static $add_venue = "INSERT INTO venue (name) values(?)";
  static $add_space = "INSERT INTO space (name,venue) values(?,?)";
  static $check_slot = "SELECT id,name FROM event WHERE space = ? AND (start+duration)>? AND start <?";
  static $add_event = "INSERT INTO event (name,space,start,duration) values(?,?,?,?)";
  
  function addVenue($name,$space_array){
    $ret = array();
    $ret['venue'] = array($name);
    $this->doStatement(self::$add_venue,$ret['venue']);
    $v_id = self::$DB->lastInsertId();
    $ret['spaces'] = array();
    foreach($space_array as $space_name){
      $values = array($space_name,$v_id);
      $this->doStatement(self::$add_space,$values);
      $s_id = self::$DB->lastInsertId();
      array_unshift($values,$s_id);
      $ret['spaces'][] = $values;
    }
    return $ret;
  }
  
  function bookEvent ($space_id,$name,$time,$duration){
    $values = array($space_id,$time,($time+$duration));
    $stmt = $this->doStatement(self::$check_slot,$values,false);
    if($result = $stmt->fetch()){
      throw new \woo\base\AppException("double booked! try again");
    }
    $this->doStatement(self::$add_event,array($name,$space_id,$time,$duration));
  }
}

//客户端,使用起来还是比较简便的
$venue = new VenueManager();
$venue->addVenue('test',array('test1','test2','test3'));

以上这篇PHP面向对象之事务脚本模式(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php 读取文件乱码问题
Feb 20 PHP
PHP中获取文件扩展名的N种方法小结
Feb 27 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
php 伪静态之IIS篇
Jun 02 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
PHP目录操作实例总结
Sep 27 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
禁止直接访问php文件代码分享
May 05 PHP
PHP框架自动加载类文件原理详解
Jun 06 #PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 #PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 #PHP
解决php-fpm.service not found问题的办法
Jun 06 #PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 #PHP
php 7新特性之类型申明详解
Jun 06 #PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 #PHP
You might like
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
理解Koa2中的async&amp;await的用法
2018/02/05 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
vue多次循环操作示例
2019/02/08 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
用python处理图片实现图像中的像素访问
2018/05/04 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
python反编译学习之字节码详解
2019/05/19 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
如何编写python的daemon程序
2021/01/07 Python
python中os.remove()用法及注意事项
2021/01/31 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
播音主持女孩的自我评价分享
2013/11/20 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
出租车拒载检讨书
2015/01/28 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android