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初学者最感迷茫的问题小结
Mar 27 PHP
基于PHP中的常用函数回顾
Jul 11 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
php基于str_pad实现卡号不足位数自动补0的方法
Nov 12 PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 PHP
PHP数组操作类实例
Jul 11 PHP
PHP加密解密实例分析
Dec 25 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 09 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 PHP
PHP解决高并发问题
Apr 01 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个人网站架设连环讲(三)
2006/10/09 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
Vue指令指令大全
2019/02/09 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
十佳班主任事迹材料
2014/01/18 职场文书
2014年上半年工作自我评价
2014/01/18 职场文书
四风存在的原因分析
2014/02/11 职场文书
安全生产目标责任书
2014/04/14 职场文书
校园安全教育心得体会
2016/01/15 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
python中的装饰器该如何使用
2021/06/18 Python
python自动计算图像数据集的RGB均值
2021/06/18 Python
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
德劲DE1105机评
2022/04/05 无线电
create-react-app开发常用配置教程
2022/06/25 Javascript