PHP面向对象之事务脚本模式(详解)
如下所示:
/*
事务脚本模式:类似于thinkphp中的model层,或者说就是操作数据库的类。
个人觉得实践中使用起来还是挺简单方便的,就是SQL语句写死了的话,灵活性就不够。
示例代码如下:
*/
namespacewoo\process;
abstractclassBase{
static$DB;//pdo对象
static$stmts=array();//sql语句句柄
function__construct(){
$dsn=\woo\base\ApplicationRegistry::getDSN();
if(is_null($dsn)){
thrownew\woo\base\AppException("NoDSN");
}
self::$DB=newPDO($dsn);
self::$DB->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
}
functionprepareStatement($stmt_s){//缓存sql语句句柄
if(isset(self::$stmts($stmt_s)){
returnself::$stmts[$stmt_s];
}
$stmt_handle=self::$DB->prepare($stmt_s);
self::$stmts[$stmt_s]=$stmt_handle;
return$stmt_handle;
}
protectedfunctiondoStatement($stmt_s,$values_a){//执行sql并获取一个语句资源
$sth=$this->prepareStatement($stmt_s);
$sth->closeCursor();
$db_result=$sth->execute($values_a);
return$sth;
}
}
//这个类就是向数据库中写入一些数据,比较简单没什么好多说的
classVenueManagerextendsBase{
static$add_venue="INSERTINTOvenue(name)values(?)";
static$add_space="INSERTINTOspace(name,venue)values(?,?)";
static$check_slot="SELECTid,nameFROMeventWHEREspace=?AND(start+duration)>?ANDstart";
static$add_event="INSERTINTOevent(name,space,start,duration)values(?,?,?,?)";
functionaddVenue($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_arrayas$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;
}
functionbookEvent($space_id,$name,$time,$duration){
$values=array($space_id,$time,($time+$duration));
$stmt=$this->doStatement(self::$check_slot,$values,false);
if($result=$stmt->fetch()){
thrownew\woo\base\AppException("doublebooked!tryagain");
}
$this->doStatement(self::$add_event,array($name,$space_id,$time,$duration));
}
}
//客户端,使用起来还是比较简便的
$venue=newVenueManager();
$venue->addVenue('test',array('test1','test2','test3'));
以上这篇PHP面向对象之事务脚本模式(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。