PHP物件導向之標識映射

來源:互聯網
上載者:User

標籤:相關   sel   ddt   blog   bsp   dom   ati   target   exists   

/*標識映射在資料對應器的基礎上增加了標識映射類,主要功能是儲存已經建立好的對象,在需要的時候可以直接擷取而不是重複建立造成系統效能的下降。在資料對應器基礎上還增加了部分調用標識映射類的方法,範例程式碼如下:*/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物件導向之標識映射

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.