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动态生成JavaScript代码
Mar 09 PHP
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 PHP
PHP连接局域网MYSQL数据库的简单实例
Aug 26 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
PHP开发注意事项总结
Feb 04 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
Sep 25 PHP
php实现分页显示
Nov 03 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
Oct 25 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
php中pcntl_fork创建子进程的方法实例
Mar 14 PHP
在Laravel中实现使用AJAX动态刷新部分页面
Oct 15 PHP
一次项目中Thinkphp绕过禁用函数的实战记录
Nov 17 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
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
php绘制一个扇形的方法
2015/01/24 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
js实现微博发布小功能
2017/01/12 Javascript
树结构之JavaScript
2017/01/24 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
Python 文件读写操作实例详解
2014/03/12 Python
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python实现的密码强度检测器示例
2017/08/23 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
Python中turtle作图示例
2017/11/15 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
保证书格式范文
2014/04/28 职场文书
2015年酒店工作总结
2015/04/28 职场文书
外出听课学习心得体会
2016/01/15 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记