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教程 变量定义
Oct 23 PHP
PHP zlib扩展实现页面GZIP压缩输出
Jun 17 PHP
php 日期和时间的处理-郑阿奇(续)
Jul 04 PHP
php urlencode()与urldecode()函数字符编码原理详解
Dec 06 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
php实现encode64编码类实例
Mar 24 PHP
PHP输出一个等腰三角形的方法
May 12 PHP
PHP超全局数组(Superglobals)介绍
Jul 01 PHP
php在数据库抽象层简单使用PDO的方法
Nov 03 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
PHP邮箱验证示例教程
Jun 01 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 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编程语言开发动态WAP页面
2006/10/09 PHP
DedeCms模板安装/制作概述
2007/03/11 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
php curl 上传文件代码实例
2015/04/27 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
php如何获取文件的扩展名
2015/10/28 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
python队列原理及实现方法示例
2019/11/27 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
学生请假条格式
2014/04/11 职场文书
工商干部先进事迹
2014/05/14 职场文书
亮剑观后感300字
2015/06/05 职场文书
初级职称评定工作总结
2015/08/13 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS