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 相关文章推荐
Snoopy类使用小例子
Apr 15 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
深入探讨<br />和 \r\n两者有什么区别??
Jun 05 PHP
解析php中memcache的应用
Jun 18 PHP
php数据库备份还原类分享
Mar 20 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
php获取百度收录、百度热词及百度快照的方法
Apr 02 PHP
php实现倒计时效果
Dec 19 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
php封装的mysqli类完整实例
Oct 18 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
phpQuery采集网页实现代码实例
Apr 02 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.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
JavaScript触发器详解
2007/03/10 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
微信小程序自定义弹出层效果
2020/05/26 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
python实现文件快照加密保护的方法
2015/06/30 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
基于python监控程序是否关闭
2020/01/14 Python
python手写均值滤波
2020/02/19 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
python字符串判断密码强弱
2020/03/18 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
文化与传播毕业生求职信
2014/03/09 职场文书
主题实践活动总结
2014/05/08 职场文书
骨干教师事迹材料
2014/12/17 职场文书
党员公开承诺书2015
2015/01/21 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang