• 技术文章 >后端开发 >php教程

    关于PHP面向对象的事务脚本模式

    不言不言2018-06-19 10:57:17原创568
    下面为大家带来一篇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'));

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    使用PHP如何做到页面注册审核

    关于PHP中ID设置自增后不连续的原因分析及解决办法

    以上就是关于PHP面向对象的事务脚本模式的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:事务脚本模式
    上一篇:关于PHP中ID设置自增后不连续的原因分析及解决办法 下一篇:关于PHP如何实现链表的定义与反转功能
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 整理总结nginx、php-fpm和mysql等的权限划分• 哪位高手有php手册 • 小弟我有关于Linux的有关问题 • 求PHP获取数据表字段值的完整代码解决方法 • 最近有点迷惘,还想请大家指导上学习的方法
    1/1

    PHP中文网