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数据缓存技术
Feb 14 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
php去除重复字的实现代码
Sep 16 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
Nov 28 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 PHP
PHP通过串口实现发送短信
Jul 08 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
php+redis实现消息队列功能示例
Sep 19 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
我的论坛源代码(九)
2006/10/09 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
js form action动态修改方法
2008/11/04 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
微信小程序实现文字跑马灯
2020/05/26 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
js实现验证码功能
2020/07/24 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
详解python编译器和解释器的区别
2019/06/24 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
车祸赔偿收入证明
2014/01/09 职场文书
邮政员工辞职信
2014/01/16 职场文书
家长给小学生的评语
2014/01/30 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
本科毕业答辩开场白
2015/05/27 职场文书