如何实现PHP面向对象之标识映射
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章主要介绍"如何实现PHP面向对象之标识映射",在日常操作中,相信很多人在如何实现PHP面向对象之标识映射问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何实现P
千家信息网最后更新 2025年11月16日如何实现PHP面向对象之标识映射
这篇文章主要介绍"如何实现PHP面向对象之标识映射",在日常操作中,相信很多人在如何实现PHP面向对象之标识映射问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何实现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"; }}到此,关于"如何实现PHP面向对象之标识映射"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
对象
标识
数据
射器
方法
数据库
代码
学习
基础
子类
作用
更多
类名
问题
中实
帮助
实用
接下来
功能
原则
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
达思sql数据库修复
深圳艾瑞软件开发
java 软件开发工具包
高斯数据库是分布式数据库吗
魔兽正式服服务器建多个角色
计算机网络技术有哪些科目
智华广州软件开发有限公司
崇明区机械网络技术采购信息
数据库属性讲解ppt
工模软件开发工程师
cf服务器北方大区
2008服务器为什么这么卡
软件开发专业开设指导意见
L2 网络技术考试是什么
绝地求生选服务器
视频流媒体服务器配置要求
网络安全利与弊作文100字
软件工程与网络技术哪个好
黑客如何攻击数据库
西安卡奔软件开发公司
软件开发结构方式有哪些
数据库表格导入不进去
工模软件开发工程师
影响数据库安全性能的因素
数据库会话自动断
淄博hr人力资源软件开发
网络安全宣传周企业稿件
网络安全手抄报电子版模版
国家批准文号数据库
搜狐汽车销量数据库