这里要说明一下 因为本人比较懒 博客中相关文章的内容更多的是对<深入PHP面向对象、模式与实践>一书中代码的整理和简单注解方便自己日后复习和参考,

对相关内容感兴趣的初学的朋友建议请先阅读原文。此处的内容只能当成一种学习的补充和参考。谢谢!
因原书中领域模型+数据映射器的示例代码是连贯在一起的 所以这里就整理在一起了。
简单介绍一下我的看法,从数据库操作的角度看领域模型主要是操作数据表中的单条记录的而数据映射器是操作整个数据表的数据的。
按原文的解释数据映射器是一个负责将数据库数据映射到对象的类,而领域模型象征着真实世界里项目中的各个参与者,它在数据中通常表现为一条记录。
废话不多说,代码和注解如下:
与领域模型相关的三个数据表结构分别为venue(场所)、space(空间)、event(事件)。
create table 'venue' (
'id' int(11) not null auto_increment,
'name' text,
primary key ('id')
)
create table 'space' (
'id' int(11) not null auto_increment,
'venue' int(11) default null,
'name' text,
primary key ('id')
)
create table 'event' (
'id' int(11) not null auto_increment,
'space' int(11) default null,
'start' mediumtext,
'duration' int(11) default null,
'name' text,
primary key ('id')
)
//领域模型(这里只建了一个Venue类用于理解)
namespace woo\domain;
abstract class DomainObject{ //抽象基类
private $id;
function __construct ($id=null){
$this->id = $id;
}
function getId(){
return $this->id;
}
//原书没有具体实现,应该是用于获取对象的从属对象的,比如venue(场所)相关的space(空间)对象
//具体的代码实现中应该从数据库中查询了相关数据并调用了Collection类,下面看到这个类的时候会有一个了解
//而且这个方法的实现应该放在子类中才对
static function getCollection($type){
return array();
}
function collection(){
return self::getCollection(get_class($this));
}
}
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;
}
function addSpace(Space $space){
$this->spaces->add($space);
$space->setVenue($this);
}
function setName($name_s){
$this->name = $name_s;
$this->markDirty();
}
function getName(){
return $this->name;
}
}
//数据映射器(正如原文的解释数据映射器是一个负责将数据库数据映射到对象的类)
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);
}
}
function createObject($array){ //将数组创建为上述领域模型中的对象
$obj = $this->doCreateObject($array); //在子类中实现
return $obj;
}
function find($id){ //通过ID从数据库中获取一条数据并创建为对象
$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);
return $object;
}
function insert(\woo\domain\DomainObject $obj){ //将对象数据插入数据库
$this->doInsert($obj);
}
//需要在子类中实现的各抽象方法
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);
}
//这里只建立一个VenueMapper类用于理解
class VenueMapper extends Mapper {
function __construct (){
parent::__construct(); //各种sql语句对象
$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(){ //返回一个sql语句对象
return $this->selectStmt;
}
}
Iterator接口定义的方法:
rewind() 指向列表开头
current() 返回当前指针处的元素
key() 返回当前的键(比如,指针的指)
next()
valid()
下面这个类是处理多行记录的,传递数据库中取出的原始数据和映射器进去,然后通过数据映射器在获取数据时将其创建成对象
abstract class Collection implements \Iterator{
protected $mapper; //数据映射器
protected $total = 0; //集合元素总数量
protected $raw = array(); //原始数据
private $result;
private $pointer = 0; //指针
private $objects = array(); //对象集合
function __construct (array $raw = null,Mapper $mapper= null){
if(!is_null($raw)&& !is_null($mapper)){
$this->raw = $raw;
$this->total = count($raw);
}
$this->mapper = $mapper;
}
function add(\woo\domain\DmainObject $object){ //这里是直接添加对象
$class = $this->targetClass();
if(!($object instanceof $class)){
throw new Exception("This is a {$class} collection");
}
$this->notifyAccess();
$this->objects[$this->total] = $object;
$this->total ++;
}
abstract function targetClass(); //子类中实现用来在插入对象时检查类型的
protected function notifyAccess(){ //不知道干嘛的
}
private function getRow($num){ //获取集合中的单条数据,就是这里通过数据映射器将数据创建成对象
$this->notifyAccess();
if($num >= $this->total || $num < 0){
return null;
}
if(isset($this->objects[$num]){
return $this->objects[$num];
}
if(isset($this->raw[$num]){
$this->objects[$num] = $this->mapper->createObject($this->raw[$num]);
return $this->objects[$num];
}
}
public function rewind(){ //重置指针
$this->pointer = 0;
}
public function current(){ //获取当前指针对象
return $this->getRow($this->pointer);
}
public function key(){ //获取当前指针
return $this->pointer;
}
public function next(){ //获取当前指针对象,并将指针下移
$row = $this->getRow($this->pointer);
if($row){$this->pointer ++}
return $row;
}
public function valid(){ //验证
return (!is_null($this->current()));
}
}
//子类
class VenueColletion extends Collection implements \woo\domain\VenueCollection{
function targetClass(){
return "\woo\domain\Venue";
}
}
//客户端
$mapper = new \woo\mapper\VenueMapper();
$venue = $mapper->find(12);
print_r($venue);
$venue = new \woo\domain\Venue();
$venue->setName("the likey lounge-yy");
//插入对象到数据库
$mapper->insert($venue);
//从数据库中读出刚才插入的对象
$venue = $mapper->find($venue->getId());
print_r($venue);
//修改对象
$venue->setName("the bibble beer likey lounge-yy");
//调用update来更新记录
$mapper->update($venue);
//再次读出对象数据
$venue = $mapper->find($venue->getId());
print_r($venue);
//结束
以上这篇PHP面向对象之领域模型+数据映射器实例(分析)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# 数据映射器
# 详解PHP的Laravel框架中Eloquent对象关系映射使用
# ThinkPHP中公共函数路径和配置项路径的映射分析
# 回答PHPCHINA上的几个问题:URL映射
# 解密ThinkPHP3.1.2版本之模块和操作映射
# PHP实现路由映射到指定控制器
# 浅析php设计模式之数据对象映射模式
# 老生常谈PHP面向对象之标识映射
# PHP实现的数据对象映射模式详解
# PHP数据对象映射模式实例分析
# php实现映射操作实例详解
# 映射器
# 数据库中
# 类中
# 是一个
# 给大家
# 面向对象
# 的是
# 单条
# 原始数据
# 会有
# 放在
# 相关内容
# 子类
# 感兴趣
# 请先
# 相关文章
# 希望能
# 并将
# 分别为
# 书中
相关文章:
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
招贴海报怎么做,什么是海报招贴?
微信小程序 input输入框控件详解及实例(多种示例)
如何正确下载安装西数主机建站助手?
,制作一个手机app网站要多少钱?
如何使用Golang table-driven基准测试_多组数据测量函数效率
如何制作一个表白网站视频,关于勇敢表白的小标题?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何在云指建站中生成FTP站点?
如何在IIS管理器中快速创建并配置网站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何高效配置香港服务器实现快速建站?
公司网站制作价格怎么算,公司办个官网需要多少钱?
魔方云NAT建站如何实现端口转发?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
在线制作视频网站免费,都有哪些好的动漫网站?
如何选择高性价比服务器搭建个人网站?
简历在线制作网站免费版,如何创建个人简历?
javascript中对象的定义、使用以及对象和原型链操作小结
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
无锡营销型网站制作公司,无锡网选车牌流程?
如何快速查询网站的真实建站时间?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
平台云上自主建站:模板化设计与智能工具打造高效网站
已有域名能否直接搭建网站?
如何在云主机上快速搭建网站?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何用花生壳三步快速搭建专属网站?
微信小程序 五星评分(包括半颗星评分)实例代码
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
制作企业网站建设方案,怎样建设一个公司网站?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
小型网站制作HTML,*游戏网站怎么搭建?
建站之星代理如何优化在线客服效率?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
免费视频制作网站,更新又快又好的免费电影网站?
C++时间戳转换成日期时间的步骤和示例代码
网站企业制作流程,用什么语言做企业网站比较好?
如何在香港免费服务器上快速搭建网站?
高防服务器如何保障网站安全无虞?
建站之星代理平台如何选择最佳方案?
小程序网站制作需要准备什么资料,如何制作小程序?
建站之星后台管理:高效配置与模板优化提升用户体验
h5在线制作网站电脑版下载,h5网页制作软件?
*请认真填写需求信息,我们会在24小时内与您取得联系。