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 相关文章推荐
用PHP和ACCESS写聊天室(五)
Oct 09 PHP
PHP Stream_*系列函数
Aug 01 PHP
php中json_encode中文编码问题分析
Sep 13 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
浅析ThinkPHP的模板输出功能
Jul 01 PHP
Codeigniter的dom类用法实例
Jun 26 PHP
PHP 9 大缓存技术总结
Sep 17 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
Dec 25 PHP
php上传excel表格并获取数据
Apr 27 PHP
PHP实现权限管理功能示例
Sep 22 PHP
Yii2.0实现生成二维码功能实例
Oct 24 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
Symfony的安装和配置方法
2016/03/17 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
Python简单生成8位随机密码的方法
2017/05/24 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
python里dict变成list实例方法
2019/06/26 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
香港通票:Hong Kong Pass
2019/02/26 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
商场消防演习方案
2014/02/12 职场文书
新年联欢会主持词
2014/03/27 职场文书
看上去很美观后感
2015/06/10 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android