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 相关文章推荐
初探PHP5
Oct 09 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
Dec 13 PHP
PHP Ajax中文乱码问题解决方法
Feb 27 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
php生成zip文件类实例
Apr 07 PHP
php导出生成word的方法
Dec 25 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
PHP的静态方法与普通方法用法实例分析
Sep 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
PHP 配置文件中open_basedir选项作用
2009/07/19 PHP
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
两个php日期控制类实例
2014/12/09 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
python实现探测socket和web服务示例
2014/03/28 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
歌颂党的演讲稿
2014/09/10 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
就业协议书范本
2014/10/08 职场文书
分居协议书范本
2014/11/03 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
运动会广播稿300字
2015/08/19 职场文书
学习委员竞选稿
2015/11/20 职场文书
2016年教师节慰问信
2015/12/01 职场文书