PHP面向对象之事务脚本模式(详解)
author:一佰互联 2019-04-26   click:181

如下所示:

/*事务脚本模式: 类似于thinkphp中的model层,或者说就是操作数据库的类。个人觉得实践中使用起来还是挺简单方便的,就是SQL语句写死了的话,灵活性就不够。示例代码如下:*/namespace wooprocess;abstract class Base{  static $DB;         //pdo对象  static $stmts = array(); //sql语句句柄    function __construct (){    $dsn = wooaseApplicationRegistry::getDSN();    if(is_null($dsn)){      throw new wooaseAppException("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 wooaseAppException("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面向对象之事务脚本模式(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持网页设计。