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 相关文章推荐
杏林同学录(九)
Oct 09 PHP
PHP字符转义相关函数小结(php下的转义字符串)
Apr 12 PHP
php学习笔记 类的声明与对象实例化
Jun 13 PHP
PHP多例模式介绍
Jun 24 PHP
php中AES加密解密的例子小结
Feb 18 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
Jun 13 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 PHP
php使用Jpgraph绘制饼状图的方法
Jun 10 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 PHP
PHP内存溢出优化代码详解
Feb 26 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
建立文件交换功能的脚本(二)
2006/10/09 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
php解决安全问题的方法实例
2019/09/19 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
致百米运动员广播稿
2014/01/29 职场文书
护士毕业生自荐信
2014/02/07 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
现实表现材料范文
2014/12/23 职场文书
英语感谢信范文
2015/01/20 职场文书
初三英语教学计划
2015/01/23 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
老员工辞职信范文
2015/05/12 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技