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中操作MySQL数据库的一些要注意的问题
Oct 09 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
dedecms函数分享之获取某一栏目所有子栏目
May 19 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
PHP的JSON封装、转变及输出操作示例
Sep 27 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中date.timezone设置分析
2011/07/29 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
PHP面向对象精要总结
2014/11/07 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
用js来解决ajax读取页面乱码
2010/11/28 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
微信小程序自定义组件
2017/08/16 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
js实现导航跟随效果
2018/11/17 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
Python模块future用法原理详解
2020/01/20 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
一道Delphi面试题
2016/10/28 面试题
顶岗实习计划书
2014/01/10 职场文书
学雷锋演讲稿
2014/03/04 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
建国大业观后感600字
2015/06/01 职场文书
暂住证明怎么写
2015/06/19 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle
Python基础之数据类型知识汇总
2021/05/18 Python
vue2实现provide inject传递响应式
2021/05/21 Vue.js
Go归并排序算法的实现方法
2022/04/06 Golang