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 相关文章推荐
NO3第三帝国留言簿制作过程
Oct 09 PHP
几种显示数据的方法的比较
Oct 09 PHP
PHP 加密解密内部算法
Apr 22 PHP
PHP基础学习小结
Apr 17 PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 PHP
php打造属于自己的MVC框架
Mar 07 PHP
编写php应用程序实现摘要式身份验证的方法详解
Jun 08 PHP
php获取网页中图片、DIV内容的简单方法
Jun 19 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
PC端微信扫码支付成功之后自动跳转php版代码
Jul 07 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 flush()与ob_flush()的区别详解
2013/06/03 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
《蚕姑娘》教学反思
2014/04/15 职场文书
外联部演讲稿
2014/05/24 职场文书
计划生育工作汇报
2014/10/28 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
同学联谊会邀请函
2019/06/24 职场文书