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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
PHP 源代码压缩小工具
Dec 22 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
PHP file_get_contents设置超时处理方法
Sep 30 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
Laravel实现autoload方法详解
May 07 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
一次因composer错误使用引发的问题与解决
Mar 06 PHP
PHP INT类型在内存中占字节详解
Jul 20 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 PHP
php7 新增功能实例总结
May 25 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
SONY SRF-M100的电路分析
2021/03/02 无线电
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
python黑魔法之编码转换
2016/01/25 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
python根据多个文件名批量查找文件
2019/08/13 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
经理管理专业自荐信范文
2013/12/31 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
组工干部演讲稿
2014/09/02 职场文书
小学语文国培研修日志
2015/11/13 职场文书
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技