PHP实现的数据对象映射模式详解


Posted in PHP onMarch 20, 2019

本文实例讲述了PHP实现的数据对象映射模式。分享给大家供大家参考,具体如下:

还是代码说话:这里还是遵循策略模式的psr-0代码规范

数据表:

PHP实现的数据对象映射模式详解

数据库连接文件Db.php(如果没有可以到前面一篇《PHP单例模式数据库连接类与页面静态化》里面找)
自动加载类文件Config.php(如果没有可以去上一篇《PHP策略模式》里拿过来)

入口文件DataUser.php

<?php
define('BASEDIR', __DIR__);
//自动加载在本文件中没有被定义的类
require 'Config.php';
spl_autoload_register('Config::autolad');
//获取数据
$user = new Data(1);
var_dump($user->id, $user->name, $user->money);
//如果想要修改数据
$user->id = 1;
$user->name = 'zhangjianping';
$user->money = 10000;
?>

获取数据的文件Data.php

<?php
class Data
{
//数据项
public $id;
public $name;
public $money;
//数据库连接对象
protected $con;
//查询数据的构造函数
public function __construct($id)
{
  //连接数据库
  $this->con = DB::getInstance()->connect();
  //查询数据
  $res = $this->con->query('select * from account where id = '.$id.' limit 1');
  $data = $res->fetch(PDO::FETCH_ASSOC);
  //把取出来的数据项存储起来
  $this->id = $data['id'];
  $this->name = $data['name'];
  $this->money = $data['money'];
}
//修改数据的析构函数
public function __destruct()
{
  $this->con->query("update account set name = '{$this->name}', 'money = {$this->money}' where id = {$this->id}");
}
}
?>

下面我们就使用工厂模式,注册树模式,数据对象映射模式来完善一下这个例子

  • 数据库连接文件Db.php
  • 自动加载类文件Config.php
  • 获取数据的文件Data.php

我们将原来的入口文件改一下:

DataUser.php

<?php
define('BASEDIR', __DIR__);
require 'Config.php';
spl_autoload_register(Config::autoload);
class DataUser
{
  public function index()
  {
    //使用工厂模式来生成对象
    $user = Factory::getUser(1);
    var_dump($user->id);
    $this->name();
    $this->money();
  }
  public function name()
  {
    $user = Factory::getUser(1);
    var_dump($user->name);
  }
  public function money()
  {
    $user = Factory::getUser(1);
    var_dump($user->money);
  }
}
?>

工厂类Factory.php

<?php
class Factory
{
  static function getUser($id)
  {
    //这里使用注册器模式,不然的话,在上面的文件中,使用工厂模式生成对象得时候就会多次创建对象,很占用资源
    //根据id不同插入到注册树对象中
    $key = 'user_'.$id;
    //从注册器中取出对象
    $user = Register::get($key);
    //如果注册器中没有就创建一个对象并注册上去
    if(!isset($user))
    {
      $user = new Data($id);
      $user = Register::set($key, $user);
    }
    return $user;
  }
}
?>

注册器类Register.php

<?php
class Register
{
  //存储对象得变量
  protected static $object;
  //注册入注册器
  public static function set($key, $value)
  {
    self::$object[$key] = $value;
  }
  //从注册器中取出
  public static function get($key)
  {
    return self::$object[$key];
  }
  //从注册器中删除
  public static function _unset($key)
  {
    unset(self::$object[$key]);
  }
}
?>

如果这时候我们将Data.php修改为Data1.php,那么在不使用工厂模式的时候就要一个一个的去修改类名,现在只需要在工厂模式中修改一下就好了,我们也可以打印出每一个对象,这时候我们会发现这3个对象都是一样的,这是因为我们使用了注册器模式。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
May 03 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
PHP文件上传主要代码讲解
Sep 30 PHP
memcache命令启动参数中文解释
Jan 13 PHP
thinkphp中memcache的用法实例
Nov 29 PHP
PHP中文编码小技巧
Dec 25 PHP
php实现在多维数组中查找特定value的方法
Jul 29 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
thinkPHP分页功能实例详解
May 05 PHP
php中Ioc(控制反转)和Di(依赖注入)
May 07 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
PHP单例模式数据库连接类与页面静态化实现方法
Mar 20 #PHP
PHP实现的策略模式示例
Mar 20 #PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 #PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 #PHP
PHP工厂模式的日常使用
Mar 20 #PHP
PHP函数积累总结
Mar 19 #PHP
PHP与Perl之间知识点区别整理
Mar 19 #PHP
You might like
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
php缓冲输出实例分析
2015/01/05 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
javascript常用方法汇总
2014/12/02 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
使用cropper.js裁剪头像的实例代码
2017/09/29 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
JS实现简易计算器
2020/02/14 Javascript
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
python正则-re的用法详解
2019/07/28 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
Skyscanner波兰:廉价航班
2017/11/07 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
普通党员四风问题对照检查材料
2014/09/27 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
先进学校事迹材料
2014/12/30 职场文书
总经理聘用协议书
2015/09/21 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
python lambda 表达式形式分析
2022/04/03 Python
nginx 配置缓存
2022/05/11 Servers