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 相关文章推荐
php5 pdo新改动加载注意事项
Sep 11 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
Jul 15 PHP
初识laravel5
Mar 02 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
PHP判断手机是IOS还是Android
Dec 09 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
PHP中substr函数字符串截取用法分析
Jan 07 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
php基于环形链表解决约瑟夫环问题示例
Nov 07 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 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操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
jQuery JSON的解析方式分享
2011/04/05 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
python的debug实用工具 pdb详解
2019/07/12 Python
python命令 -u参数用法解析
2019/10/24 Python
python如何实现复制目录到指定目录
2020/02/13 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
力学专业毕业生自荐信
2013/11/17 职场文书
实习生自我评价
2014/01/18 职场文书
学校社会实践活动总结
2014/07/03 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
css3新特性的应用示例分析
2022/03/16 HTML / CSS
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers