首页 > 语言 > PHP > 正文

PHP实现的数据对象映射模式详解

2024-05-05 00:07:40
字体:
来源:转载
供稿:网友

本文实例讲述了PHP实现的数据对象映射模式。分享给大家供大家参考,具体如下:

还是代码说话:这里还是遵循策略模式的psr-0代码规范

数据表:

PHP,数据对象,映射模式

数据库连接文件Db.php(如果没有可以到前面一篇《PHP单例模式数据库连接类与页面静态化》里面找)
自动加载类文件Config.php(如果没有可以去上一篇《PHP策略模式》里拿过来)

入口文件DataUser.php

<?phpdefine('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

<?phpclass 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

<?phpdefine('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

<?phpclass 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

<?phpclass 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教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选