亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP面向對象之工作單元(實例講解)

2024-05-04 23:58:17
字體:
來源:轉載
供稿:網友

工作單元

這個模式涉及到了領域模型、數據映射器和標識映射,這里就統一進行整理和回顧了。

$venue = new /woo/domain/Venue(null,"The Green Tree");

/woo/domain/ObjectWatcher::instance()->performOperations();

現在以上面的二行客戶端代碼為切入點大概的敘述一下這個模式是怎么工作的。

第一句在使用領域模型對象創建一個對象的時候,它就調用了標識映射ObjectWatcher類

將自己標記為一個需要新增的對象。第二句的performOperations方法將保存在標識映射器的屬性$new中的對象

插入到了數據庫中。注意它內部調用的$obj->finder()方法是領域模式中通過HelperFactory工廠類生成一個相對應的數據映射器類并return過來。

HelperFactory這個類下面沒有具體實現(原文也沒有實現),其實就是根據參數傳入的類的類型使用條件分支創建對應的數據映射器。

下面直接看代碼和注釋進行理解。

namespace woo/domain;//標識映射class ObjectWatcher{    private $all = array();        //存放對象的小倉庫  private $dirty = array();      //存放需要在數據庫中修改的對象  private $new = array();        //存放需要在數據庫中新增的對象  private $delete = array();      //存放需要在數據庫中刪除的對象  private static $instance;      //單例      private function __construct (){}    static function instance(){    if(!self::$instance){      self::$instance = new ObjectWatcher();    }    return self::$instance;  }    //獲取一個唯一的標識,這里采用了領域類類名+ID的方式創建一個唯一標識,避免多個數據庫表調用這個類時出現ID重復的問題  function globalKey(DomainObject $obj){    $key = get_class($obj) . "." . $obj->getId();    return $key;  }    //添加對象  static function add(DomainObject $obj){    $inst = self::instance();    $inst->all[$inst->globalKey($obj)] = $obj;  }    //獲取對象  static function exists($classname,$id){    $inst = self::instance();    $key = "$classname.$id";    if(isset($inst->all[$key]){      return $inst->all[$key];    }    return null;  }    //標記為需要刪除的對象  static function addDelete(DomainObject $obj){    $self = self::instance();    $self->delete[$self->globalKey($obj)] = $obj;  }    //標記為需要修改的對象  static function addDirty(DomainObject $obj){    $inst = self::instance();    if(!in_array($obj,$inst->new,true)){      $inst->dirty[$inst->globalKey($obj)] = $obj;    }  }    //標記為需要新增的對象  static function addNew(DomainObject $obj){    $inst = self::instance();    $inst->new[] = $obj;  }    //標記為干凈的對象  static function addClean(DomainObject $obj){    $self = self::instance();    unset($self->delete[$self->globalKey($obj)]);    unset($self->dirty[$self->globalKey($obj)]);    $self->new = array_filter($self->new,function($a) use($obj) {return !($a === $obj);});  }      //將上述需要增刪改的對象與數據庫交互進行處理    function performOperations(){    foreach($this->dirty as $key=>$obj){      $obj->finder()->update($obj);    //$obj->finder()獲取一個數據映射器    }    foreach($this->new as $key=>$obj){      $obj->finder()->insert($obj);    }    $this->dirty = array();    $this->new = array();  }}//領域模型abstract class DomainObject{      //抽象基類    private $id = -1;    function __construct ($id=null){    if(is_null($id)){      $this->markNew();      //初始化時即被標記為需要新增的對象了    } else {      $this->id = $id;    }    }    //調用了標識映射的標記對象的方法  function markNew(){    ObjectWatcher::addNew($this);  }    function markDeleted(){    ObjectWatcher::addDelete($this);  }    function markDirty(){    ObjectWatcher::addDirty($this);  }    function markClean(){    ObjectWatcher::addClean($this);  }    function setId($id){    $this->id = $id;  }    function getId(){    return $this->id;  }      function finder(){    return self::getFinder(get_class($this));  }    //通過工廠類來實例化一個特定類型的數據映射器對象,例如VenueMapper  //這個對象將被標識映射器中的performOperations方法調用用于與數據庫交互進行增刪改的操作  static function getFinder($type){    return HelperFactory::getFinder($type);  }  }class Venue extends DomainObject {  private $name;  private $spaces;    function __construct ($id = null,$name=null){    $this->name= $name;    $this->spaces = self::getCollection('//woo//domain//space');     parent::__construct($id);  }    function setSpaces(SpaceCollection $spaces){    $this->spaces = $spaces;    $this->markDirty();            //標記為需要修改的對象  }    function addSpace(Space $space){    $this->spaces->add($space);    $space->setVenue($this);    $this->markDirty();            //標記為需要修改的對象  }    function setName($name_s){    $this->name = $name_s;    $this->markDirty();            //標記為需要修改的對象  }    function getName(){    return $this->name;  }}//領域模型class Space extends DomainObject{  //.........  function setName($name_s){    $this->name = $name_s;    $this->markDirty();  }    function setVenue(Venue $venue){    $this->venue = $venue;    $this->markDirty();  }}//數據映射器abstract class Mapper{    abstract static $PDO;    //操作數據庫的pdo對象  function __construct (){    if(!isset(self::$PDO){      $dsn = /woo/base/ApplicationRegistry::getDSN();      if(is_null($dsn)){        throw new /woo/base/AppException("no dns");      }      self::$PDO = new /PDO($dsn);      self::$PDO->setAttribute(/PDO::ATTR_ERRMODE,/PDO::ERRMODE_EXCEPTION);    }  }    //獲取標記的對象  private function getFroMap($id){    return /woo/domain/ObjectWatcher::exists($this->targetClass(),$id);  }      //新增標記的對象  private function addToMap(/woo/domain/DomainObject $obj){//////    return /woo/domain/ObjectWatcher::add($obj);  }      //將數據庫數據映射為對象  function createObject($array){    $old = $this->getFromMap($array['id']);    if($old){return $old;}    $obj = $this->doCreateObject($array);    $this->addToMap($obj);    $obj->markClean();    return $obj;  }    function find($id){                //通過ID從數據庫中獲取一條數據并創建為對象      $old = $this->getFromMap($id);            if($old){return $old}                    $this->selectStmt()->execute(array($id));    $array= $this->selectStmt()->fetch();    $this->selectStmt()->closeCursor();    if(!is_array($array)){      return null;    }    if(!isset($array['id'])){      return null;    }    $object = $this->createObject($array);    $this->addToMap($object);              return $object;    }      function insert(/woo/domain/DomainObject $obj){      //將對象數據插入數據庫    $this->doInsert($obj);    $this->addToMap($obj);              }    //需要在子類中實現的各個抽象方法  abstract function targetClass();                    //獲取類的類型  abstract function update(/woo/domain/DomainObject $objet);        //修改操作  protected abstract function doCreateObject(array $array);        //創建對象  protected abstract function selectStmt();                //查詢操作  protected abstract function doInsert(/woo/domain/DomainObject $object);  //插入操作  }class VenueMapper extends Mapper {  function __construct (){        parent::__construct();      //預處理對象    $this->selectStmt = self::$PDO->prepare("select * from venue where id=?");    $this->updateStmt = self::$PDO->prepare("update venue set name=?,id=? where id=?");    $this->insertStmt = self::$PDO->prepare("insert into venue (name) values(?)");  }    protected function getCollection(array $raw){    //將Space數組轉換成對象集合    return new SpaceCollection($raw,$this);          }    protected function doCreateObject (array $array){  //創建對象    $obj = new /woo/domain/Venue($array['id']);    $obj->setname($array['name']);    return $obj;  }    protected function doInsert(/woo/domain/DomainObject $object){ //將對象插入數據庫    print 'inserting';    debug_print_backtrace();    $values = array($object->getName());    $this->insertStmt->execute($values);    $id = self::$PDO->lastInsertId();    $object->setId($id);  }    function update(/woo/domain/DomainObject $object){    //修改數據庫數據    print "updation/n";    $values = array($object->getName(),$object->getId(),$object->getId());    $this->updateStmt->execute($values);  }    function selectStmt(){          //返回一個預處理對象    return $this->selectStmt;  }  }//客戶端$venue = new /woo/domain/Venue(null,"The Green Tree");        //在初始化時就被標記為新增對象了$venue->addSpace(new /woo/domain/Space(null,"The Space Upstairs"));  //這二行addSpace方法因為venue已經被標記新增所以不會再標記為修改對象,但是space在初始化的時候會被標記為新增對象$venue->addSpace(new /woo/domain/Space(null,"The Bar Stage"));      /woo/domain/ObjectWatcher::instance()->performOperations();      //與數據庫交互新增一條Venue數據,以及二條space數據

以上這篇PHP面向對象之工作單元(實例講解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线| 久久亚洲精品一区二区| 国产精品69久久| 国产精品亚洲美女av网站| 欧美国产日本在线| 欧美日韩精品在线播放| 久久色在线播放| 久久久之久亚州精品露出| 国产欧美日韩精品在线观看| 久久影视电视剧凤归四时歌| 亚洲精品白浆高清久久久久久| 欧美视频在线免费看| 亚洲午夜未删减在线观看| 北条麻妃一区二区在线观看| 狠狠干狠狠久久| 国产精品一区二区久久久| 国产一区二区三区毛片| 国产精品免费一区二区三区都可以| 欧美日本高清视频| 欧美日韩美女视频| 这里只有精品在线播放| 2021国产精品视频| 不卡伊人av在线播放| 久久69精品久久久久久国产越南| 欧美激情亚洲国产| 久久久999国产精品| 亚洲人成在线一二| 九九热这里只有在线精品视| 国产一区私人高清影院| 国内精久久久久久久久久人| 免费不卡欧美自拍视频| 在线精品视频视频中文字幕| 欧美猛交免费看| 欧美一级高清免费| 国产成人在线一区二区| 国产精品视频yy9099| 91精品国产91久久久久久久久| 国产精品伦子伦免费视频| 欧美乱大交xxxxx| 国产精品一区电影| 国外日韩电影在线观看| 日韩精品中文字幕在线| 欧美日韩ab片| 97av在线视频免费播放| 精品香蕉在线观看视频一| 中文字幕亚洲综合久久筱田步美| 日本亚洲精品在线观看| 美女扒开尿口让男人操亚洲视频网站| 国产日韩在线免费| 日韩网站免费观看高清| 国产精品99久久久久久白浆小说| 社区色欧美激情 | 国产日韩在线看| 大伊人狠狠躁夜夜躁av一区| 日韩av一区二区在线观看| 国产精品丝袜久久久久久不卡| 亚洲欧洲一区二区三区久久| 久久在线免费观看视频| 九九九久久国产免费| 欧美激情一区二区三区成人| 亚洲人免费视频| 97久久精品在线| 国产精品极品美女在线观看免费| 美女视频黄免费的亚洲男人天堂| 尤物九九久久国产精品的分类| 国产欧美日韩免费| 国产精品久久久久久久9999| 国产97色在线| 欧美精品午夜视频| 欧美有码在线观看视频| 国产亚洲精品美女久久久| 在线a欧美视频| 神马国产精品影院av| 欧美激情国内偷拍| 一本一道久久a久久精品逆3p| 亚洲美女www午夜| 欧美成人在线网站| 亚洲天堂av网| 亚洲欧美在线x视频| 日韩中文字幕第一页| 欧美一区二区视频97| 在线电影av不卡网址| 一区二区三区在线播放欧美| 亚洲成人激情图| 国产日韩欧美综合| 中文字幕在线看视频国产欧美在线看完整| 国产亚洲一区二区在线| 欧美成在线观看| 91成人在线观看国产| 亚洲欧美日韩国产精品| 亚洲精品美女在线观看播放| 欧美成人精品影院| 91成人福利在线| 久久久久久久久网站| 精品毛片三在线观看| 97人洗澡人人免费公开视频碰碰碰| 日韩欧美在线中文字幕| 91在线色戒在线| 77777亚洲午夜久久多人| 国产成人精品国内自产拍免费看| 国产精品久久久久久久久久| 久久久久久久久久久免费精品| 久久久噜久噜久久综合| 欧美xxxx18国产| 精品视频—区二区三区免费| 一本色道久久综合亚洲精品小说| 91免费国产网站| 亚洲成人精品在线| 亚洲激情在线观看视频免费| 国产精品99久久久久久久久| 欧美整片在线观看| 国产有码一区二区| 欧美精品在线观看91| 亚洲国内精品视频| 1769国内精品视频在线播放| 8050国产精品久久久久久| 国产精品在线看| 成人春色激情网| 亚洲最大的av网站| 欧美老女人在线视频| 91免费的视频在线播放| 国产精品扒开腿爽爽爽视频| 亚洲欧美另类在线观看| 久久的精品视频| 国产精品久久久久久亚洲影视| 国产成人激情小视频| 中文字幕免费精品一区| 成人高h视频在线| 欧美一级免费看| 日韩中文字幕亚洲| 国产亚洲精品久久久久久| 国产精品免费一区二区三区都可以| 亚洲精品日韩激情在线电影| 欧美乱妇高清无乱码| 国产一区二区三区直播精品电影| 日韩精品免费在线视频观看| 国产免费久久av| 欧美性精品220| 亚洲精品自拍第一页| 亚洲第一页中文字幕| 91精品视频专区| 在线视频免费一区二区| 国产成人精品综合| 亚洲人免费视频| 国内精品一区二区三区四区| 国产精品国语对白| 欧美高清videos高潮hd| 狠狠躁夜夜躁人人躁婷婷91| 国产精品久久久久久久久久东京| 欧美电影免费观看高清| 成人美女免费网站视频| 美女av一区二区| 九九久久久久99精品| 成人激情在线观看| 日韩精品丝袜在线| 一区二区三区四区视频| 亚洲国产成人91精品| 久久精品国产一区二区电影| 国内精品久久久久久久| 成人欧美一区二区三区在线| 成人午夜小视频| 狠狠操狠狠色综合网| 久久国产精品久久精品| 久久精品精品电影网|