国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

老生常談PHP面向對象之標識映射

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

標識映射在數據映射器的基礎上增加了標識映射類,主要功能是保存已經創建好的對象,在需要的時候可以直接獲取而不是重復創建造成系統性能的下降。

在數據映射器基礎上還增加了部分調用標識映射類的方法,示例代碼如下:

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";  }}

以上這篇老生常談PHP面向對象之標識映射就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。

 

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

圖片精選

主站蜘蛛池模板: 普安县| 酒泉市| 淳化县| 昌图县| 上饶市| 舟山市| 遵化市| 进贤县| 于都县| 横山县| 明光市| 丰城市| 乐昌市| 五常市| 四川省| 二连浩特市| 东乡族自治县| 西乡县| 新郑市| 古田县| 江西省| 祁阳县| 仙游县| 祁连县| 井陉县| 文昌市| 栾川县| 万载县| 九寨沟县| 云和县| 鄂托克旗| 江西省| 南皮县| 五台县| 明水县| 枣强县| 龙海市| 哈尔滨市| 秭归县| 兴安盟| 苍山县|