PHP物件導向的標識映射介紹

來源:互聯網
上載者:User
下面小編就為大家帶來一篇老生常談PHP物件導向之標識映射。小編覺得挺不錯的。現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

標識映射在資料對應器的基礎上增加了標識映射類,主要功能是儲存已經建立好的對象,在需要的時候可以直接擷取而不是重複建立造成系統效能的下降。

在資料對應器基礎上還增加了部分調用標識映射類的方法,範例程式碼如下:


namespace woo\domain;//標識映射類class ObjectWatcher{    private $all = 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;  }}namespace woo\mapper;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);  }      //對比原資料對應器的代碼,便發現它不是直接建立對象而是首先在標識映射類中尋找,找不到才調用的  //子類的方法建立並插入到標識映射類,下面的find方法也遵循了這一原則  function createObject($array){              $old = $this->getFromMap($array['id']);  //新增    if($old){return $old}          //新增    $obj = $this->doCreateObject($array);  //在子類中實現    $this->addToMap($obj);          //新增    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 SpaceMapper extends Mapper {  //其他代碼在資料對應器一文中已有實現這裡略過  //.............    //類名,在標識映射類中產生唯一標識用的  protected function targetClass(){    return "woo\\domain\\Space";  }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.