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中操作MySQL数据库的一些要注意的问题
Oct 09 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
一个漂亮的php验证码类(分享)
Aug 06 PHP
php去除HTML标签实例
Nov 06 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
php构造函数的继承方法
Feb 09 PHP
php三种实现多线程类似的方法
Oct 30 PHP
php 获取文件行数的方法总结
Oct 11 PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
May 23 PHP
PHP常见数组排序方法小结
Aug 20 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
短波的认识
2021/03/01 无线电
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP实现变色验证码实例
2014/01/06 PHP
PHP7匿名类用法分析
2016/09/26 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
php 浮点数比较方法详解
2017/05/05 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
Python迭代用法实例教程
2014/09/08 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
python多线程下信号处理程序示例
2019/05/31 Python
django认证系统 Authentication使用详解
2019/07/22 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
公务员转正鉴定材料
2014/02/11 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL