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分页函数
Oct 09 PHP
PHP 一个页面执行时间类代码
Mar 05 PHP
Smarty Foreach 使用说明
Mar 23 PHP
深入探讨<br />和 \r\n两者有什么区别??
Jun 05 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
Jun 24 PHP
Zend Framework页面缓存实例
Jun 25 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
Mar 16 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 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
模仿OSO的论坛(二)
2006/10/09 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
JavaScript 大数据相加的问题
2011/08/03 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
python调用java的Webservice示例
2014/03/10 Python
python交互式图形编程实例(三)
2017/11/17 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
优秀应届毕业生推荐信
2014/02/18 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
欠条格式范本
2015/07/03 职场文书