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下使用strpos需要注意 === 运算符
Jul 17 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
php根据生日计算年龄的方法
Jul 13 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
Jul 04 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 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
克隆一个新项目的快捷方式
2013/04/10 PHP
微信支付开发发货通知实例
2016/07/12 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
linux下进程间通信的方式
2013/01/23 面试题
幼师自我鉴定
2014/02/01 职场文书
六查六看自检自查剖析材料
2014/10/14 职场文书
关于安全的广播稿
2014/10/23 职场文书
走近毛泽东观后感
2015/06/04 职场文书
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL