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的ob_start();控制您的浏览器cache!
Nov 25 PHP
利用PHP实现短域名互转
Jul 05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
php提高网站效率的技巧
Sep 29 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
Dec 24 PHP
PHP 二维数组和三维数组的过滤
Mar 16 PHP
ThinkPHP3.2.3实现分页的方法详解
Jun 03 PHP
PHP会员找回密码功能的简单实现
Sep 05 PHP
php json中文编码为null的解决办法
Dec 14 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
php面向对象重点知识分享
Sep 27 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连接Oracle for NT 远程数据库
2006/10/09 PHP
基于mysql的论坛(6)
2006/10/09 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
2016/09/26 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
JavaScript延迟加载
2021/03/09 Javascript
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
Python 命令行非阻塞输入的小例子
2013/09/27 Python
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
详解python之配置日志的几种方式
2017/05/22 Python
深入浅出学习python装饰器
2017/09/29 Python
Python3生成手写体数字方法
2018/01/30 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
详解python分布式进程
2018/10/08 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
建筑工程技术应届生求职信
2013/11/17 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL