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 相关文章推荐
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
Apr 09 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
php中chdir()函数用法实例
Nov 13 PHP
8个PHP数组面试题
Jun 23 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
thinkphp命名空间用法实例详解
Dec 30 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
Laravel学习教程之request validation的编写
Oct 25 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
Laravel中10个有用的用法小结
May 06 PHP
Laravel 数据库加密及数据库表前缀配置方法
Oct 10 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 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
学习ExtJS Panel常用方法
2009/10/07 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
layui导航栏实现代码
2017/05/19 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
python字符串连接的N种方式总结
2014/09/17 Python
详细解析Python中的变量的数据类型
2015/05/13 Python
Python线程创建和终止实例代码
2018/01/20 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
django的登录注册系统的示例代码
2018/05/14 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
python实现堆排序的实例讲解
2020/02/21 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
轻化专业学生实习自我鉴定
2013/09/20 职场文书
计算机应用专业推荐信
2013/11/13 职场文书
网络维护中文求职信
2014/01/03 职场文书
成立公司计划书
2014/05/07 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
初一英语教学反思
2016/02/15 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书