PHP面向对象之事务脚本模式

/*
事务脚本模式: 类似于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‘));
时间: 2024-10-05 20:31:17

PHP面向对象之事务脚本模式的相关文章

.NET应用架构设计—表模块模式与事务脚本模式的代码编写

阅读目录: 1.背景介绍 2.简单介绍表模块模式.事务脚本模式 3.正确的编写表模块模式.事务脚本模式的代码 4.总结 1.背景介绍 要想正确的设计系统架构就必须能正确的搞懂每个架构模式的用意,而不是胡子眉毛一把抓.现在有一个现象是什么呢,项目的结构从表面上看是很不错,层分的很合理,其实对业务系统来说也就那么几种层设计方法,但是现在很多项目的逻辑架构的设计不是理想,有很多概念大家并不是很了解,当然也许每个人对技术的追求不同罢了.不管你追求不追求,事实我们还是要去往正确的方向努力才对的. 很多人包

事务脚本

本文摘抄自<.NET企业级应用架构设计> 业务逻辑层的模式的发展历史 历史上,事务脚本是第一个广泛应用的业务逻辑模式. 后来出现了基于表数据的表模块模式,仍然属于过程式模式,但是加入了一些面向对象思维. 在面向对象开发兴起之后,出现了基于对象的业务逻辑模式,最简单的对象模型就像是数据库表的数据模型,这里的对象就是数据库中的记录,并加了一些额外的方法,这种模式通常叫做活动记录模式. 随着业务逻辑的复杂性越大,软件的抽象程度越高,这时就应该从领域着眼,创建一个领域驱动的对象模型,这种模式通常叫做领

你在用什么思想编码:事务脚本 OR 面向对象?

最近在公司内部做技术交流的时候,说起技能提升的问题,调研大家想要培训什么,结果大出我意料,很多人想要培训:面向对象编码.于是我抛出一个问题:你觉得我们现在的代码是面向对象的吗?有人回答:是,有人回答否.我对这个问题的回答是:语法上,是了,但是架构上或者思想上,不是.我们现在的大部分代码,如果要死扣一个名词的话,那就是:事务脚本. 1:最开始的事务脚本 在 Martin Fowler 的书中,存在一个典型的 应用场景,即"收入确认"(Revenue Recognition).该"

事务脚本-领域模型

Martin Fowler定义是: 事务脚本,将所有逻辑组织在一个单一过程,进行数据库直接调用,每个业务请求都有自己的事务脚本,并且是一个类的公开方法. 领域模型,是一系列相互关联的对象,每个对象代表一定意义的独立体,既可以一起以一种大规模方式协作:也可以小到以单线方式运行. 事务脚本总体来说:就像直奔主题,平铺直叙,就功能谈功能,直接没有回旋余地:领域模型给人感觉好像肚子里就那么点货而领域模型则象是文人骚客,上了一个档次,会使用美妙表达方式,有余地. 比如唐诗:清明时节雨纷纷,路上行人欲断魂:

云计算设计模式翻译(三):Compensating Transaction Pattern(事务修正模式)

先说明一下:这个模式的中文我一直找不到一个比较恰当的中文来表述,姑且在本文中称之为事务修正模式吧,如果各位觉得有更合适的称呼欢迎提出. 这个模式指的是对于一个由一系列步骤组成.并遵循最终一致性的操作来说,如果一个或多个中间步骤发生错误,那么就必须要对这次操作的步骤进行撤销.对于一个实现了复杂业务逻辑和工作流的云端应用来说,遵循最终一致性的操作随处可见,所以本模式应用场景还是比较多得. Context and Problem 运行在云端的应用程序通常会频繁地修改数据,而这些数据通常会在分布在不同物

面向对象之简单工厂模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Interface { class InterfaceTest { static void Main(string[] args) { #region 测试Cat,Monkey,Bear类 introduction test; for (int i = 1; i<=3; i++) { switch (i)

mysql 、sqlserver数据库,实时同步,增量同步(脚本模式)

数据集成(Data Integration)产品提供数据同步服务,有向导模式和脚本模式两种方式.向导模式更简单,脚本模式更灵活. 本章介绍如何将Table Store中的增量数据通过数据集成的脚本模式同步到OpenSearch中. 途径 数据集成脚本模式 Reader:OTSStreamReader Writer:OSSWriter 配置Table Store 无需配置. 配置OSS 无需配置. 配置数据集成 创建Table Store数据源. 说明 如果已经创建了Table Store的数据源

三大常用数据库事务详解之三:事务运行模式

三.事务的运行模式 通常,事务以3种模式运行,他们分别是: 1. 自动提交事务 每一条单独的SQL语句都在其执行完成后进行自动提交事务,即执行 SQL 语句后就会马上自动隐式执行 COMMIT 操作.如果出现错误,则进行事务回滚至之前状态. SQL SERVER和MY SQL中都默认开启自动提交事务,ORACLE则显式提交事务.这三种产品都提供了各自的方式来开闭自动提交事务模式,具体如下: 1)MYSQL中通过下面语句来开启或关闭当前会话或全局的自动提交事务模式. set session aut

脚本模式下的填报表制作

填报是报表工具不可或缺的功能之一,润乾报表不仅提供了多源 SQL 填报方式,而且提供了脚本模式填报,以便适应不同的填报数据处理需求.在线教程中对多源 SQL 方式做了详细的配置说明,这里就不再赘述了.(附在线教程地址:http://doc.raqsoft.com.cn/report/input/zzygwgstbb.html) 今天小编将带领大家解锁另外一种填报处理方式——脚本模式 以行式填报表实现雇员信息维护为例,我们来看一下脚本模式如何实现数据处理,请紧随小编的步伐: 第一步 新建填报表,编