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扩展介绍与开发教程
Aug 19 PHP
PHP面向对象之旅:深入理解static变量与方法
Jan 06 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
php将csv文件导入到mysql数据库的方法
Dec 24 PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
Apr 27 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 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+javascript的日历控件
2009/11/19 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
JavaScript 数组运用实现代码
2010/04/13 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
Angular5中状态管理的实现
2018/09/03 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
班组长工作职责
2013/12/25 职场文书
新品发布会主持词
2014/04/02 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
2014年管理工作总结
2014/11/22 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
雷锋电影观后感
2015/06/10 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
python 如何用terminal输入参数
2021/05/25 Python
Python图片处理之图片裁剪教程
2021/05/27 Python
详解Redis基本命令与使用场景
2021/06/01 Redis
Python中glob库实现文件名的匹配
2021/06/18 Python
浅谈MySQL user权限表
2021/06/18 MySQL
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技