事务层和业务逻辑层在java是比较常用的写法, 因为 php 是以向面过程出名,当支持oop的时候,我想就可以好像
java那样再细分多事务层和逻辑层, 我一般定义为service层和dao层, dao层负责数据库的update,select等,
但是dao层是没有事务的,只有行为; service层是有事务的,但不应该出现sql等的行为,事务与逻辑分离,就可以解
决一些batch update的问题, 不在dao中出现事务,就是为了解决同时有多个update行为时带来的高偶合,
dao的接口与子类的定义, service接口与子类的定义, 这个例子其实介绍php的接口用法可能更加好,,呵呵
interface Dao {
// do some sql , no transaction,
public function doMyDao();
}
class ADao implements Dao {
public function doMyDao() {
echo "Now Time: " . time();
}
}
class BDao implements Dao {
public function doMyDao() {
echo "Now Date: " . date("Ymd");
}
}
interface Service {
public function setDao( $_dao ); // $_dao if typeof interface Dao
public function doMyService();
}
class AService implements Service {
var $dao = NULL; // 该属性的类型,应该是 上面的接口Dao的类型,
public function setDao( $_dao ) {
$this->dao = $_dao;
}
// 定义一些带事务的function,
public function doMyService() {
// 在这里定义了回调函数,回调函数的函数体是直接调用 dao的 doMyDao()方法, 将会在这里进行事务,
// 熟悉java的人一定可以明白这个写法, 我是java出来的, 一些设计和开发模式保留着java的习惯.
$st = new SqlTransaction( create_function(
'$tmpDao',
'return $tmpDao->doMyDao();'
),
$this->dao);
$st->execute();
}
}
// 这是一个事务管理类, 负责事务的提交,回滚
class SqlTransaction {
var $callBack = NULL; // 回调函数
var $param = NULL; // 回调函数的参数
function SqlTransaction( $_callBack, $_param ) {
$this->param = $_param;
$this->callBack = $_callBack;
}
function execute() {
// do some transaction
// beginTransaction()
$re = call_user_func( $this->callBack, $this->param );
// $re is affected rows, 调用回调函数,并给回调函数传值, 回调函数的函数体在上面有定义
if( $re > 1 ) ; // commit();
else if( $re == 0 ) ; // no affected
else ; // error, rollBack();
return $re;
// 根据回调函数不同的返回值,就可以判定运行结果,以控制事务的提交和回滚.
}
}
// 例子
$aService = new AService();
$aService->setDao( new ADao() );
$aService->doMyService();
// 如果传值是ADao,那么doMyService 中最后的结果是调用ADao中的doMyDao,同理用于BDao




















