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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
PHP 中执行排序与 MySQL 中排序
Apr 21 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
php引用返回与取消引用的详解
Jun 08 PHP
浅析php数据类型转换
Jan 09 PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 PHP
国产PHP开发框架myqee新手快速入门教程
Jul 14 PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 PHP
php实现用户注册密码的crypt加密
Jun 08 PHP
php-fpm中max_children的配置
Mar 15 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 PHP
PHP 构造函数和析构函数原理与用法分析
Apr 21 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判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
js打印纸函数代码(递归)
2010/06/18 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
python如何安装下载后的模块
2020/07/03 Python
详解python内置模块urllib
2020/09/09 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
初中国旗下的演讲稿
2014/08/28 职场文书
医德考评自我评价
2014/09/14 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
护士工作心得体会
2016/01/25 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL