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也可以?成Shell Script
Oct 09 PHP
PHP产生随机字符串函数
Dec 06 PHP
php防盗链的常用方法小结
Jul 02 PHP
PHP导入Excel到MySQL的方法
Apr 23 PHP
php操作SVN版本服务器类代码
Nov 27 PHP
php中的动态调用实例分析
Jan 07 PHP
php生成二维码
Aug 10 PHP
在PHP中使用FastCGI解析漏洞及修复方案
Nov 10 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
实例分析基于PHP微信网页获取用户信息
Nov 24 PHP
总结PHP内存释放以及垃圾回收
Mar 29 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
jquery操作select方法汇总
2015/02/05 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
pyqt5简介及安装方法介绍
2018/01/31 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
若干个Java基础面试题
2015/05/19 面试题
商务助理岗位职责
2013/11/13 职场文书
企业年度评优方案
2014/06/02 职场文书
2014小学一年级班主任工作总结
2014/12/05 职场文书
教师听课评语大全
2014/12/31 职场文书
实习科室评语
2015/01/04 职场文书
关于长城的导游词
2015/01/30 职场文书
聚会通知怎么写
2015/04/23 职场文书
党小组考察意见
2015/06/02 职场文书
2019年思想汇报
2019/06/20 职场文书