PHP面向对象之事务脚本模式(详解)

发布时间 - 2026-01-11 01:45:57    点击率:

如下所示:

/*
事务脚本模式: 类似于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面向对象之事务脚本模式(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# 事务脚本模式  # thinkPHP中钩子的两种配置调用方法详解  # thinkPHP中钩子的使用方法实例分析  # PHP钩子与简单分发方式实例分析  # thinkPHP基于反射实现钩子的方法分析  # php面向对象值单例模式  # PHP面向对象程序设计组合模式与装饰模式详解  # 老生常谈PHP面向对象之命令模式(必看篇)  # 老生常谈PHP面向对象之注册表模式  # 老生常谈PHP面向对象之解释器模式  # 浅谈PHP面向对象之访问者模式+组合模式  # PHP钩子实现方法解析  # 句柄  # 给大家  # 死了  # 希望能  # 所示  # 或者说  # 这篇  # 多说  # 类似于  # 数据库中  # 小编  # 大家多多  # 面向对象  # 客户端  # 没什么  # 实践中  # is_null  # getDSN  # throw  # base 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 详解阿里云nginx服务器多站点的配置  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  phpredis提高消息队列的实时性方法(推荐)  智能起名网站制作软件有哪些,制作logo的软件?  🚀拖拽式CMS建站能否实现高效与个性化并存?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  如何快速选择适合个人网站的云服务器配置?  ,交易猫的商品怎么发布到网站上去?  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  如何利用DOS批处理实现定时关机操作详解  零基础网站服务器架设实战:轻量应用与域名解析配置指南  JavaScript如何操作视频_媒体API怎么控制播放  Laravel怎么判断请求类型_Laravel Request isMethod用法  Linux系统运维自动化项目教程_Ansible批量管理实战  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  html5的keygen标签为什么废弃_替代方案说明【解答】  *服务器网站为何频现安全漏洞?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  PHP 500报错的快速解决方法  教学论文网站制作软件有哪些,写论文用什么软件 ?  深圳网站制作的公司有哪些,dido官方网站?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  canvas 画布在主流浏览器中的尺寸限制详细介绍  再谈Python中的字符串与字符编码(推荐)  EditPlus中的正则表达式 实战(2)  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Bootstrap整体框架之JavaScript插件架构  Laravel安装步骤详细教程_Laravel环境搭建指南  香港服务器部署网站为何提示未备案?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  JS实现鼠标移上去显示图片或微信二维码  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  新三国志曹操传主线渭水交兵攻略  移动端脚本框架Hammer.js  原生JS实现图片轮播切换效果  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)