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 相关文章推荐
写一个用户在线显示的程序
Oct 09 PHP
openPNE常用方法分享
Nov 29 PHP
PHP读取xml方法介绍
Jan 12 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
php+mysqli使用面向对象方式更新数据库实例
Jan 29 PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 PHP
CI框架集成Smarty的方法分析
May 17 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
php中10个不同等级压缩优化图片操作示例
Nov 14 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
PHP时间处理类操作示例
Sep 05 PHP
PHP实现页面静态化深入讲解
Mar 04 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
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
php二分查找二种实现示例
2014/03/12 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
2017/03/09 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
Python错误处理操作示例
2018/07/18 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
django使用多个数据库的方法实例
2021/03/04 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
重阳节登山活动方案
2014/02/03 职场文书
公司委托书怎么写
2014/08/02 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
金榜题名主持词
2015/07/02 职场文书
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏