7.数据对象映射模式

这里写图片描述

比如, new 一个对象,然后设置一些属性,就和数据库中表的一条记录对应起来。

创建表:

create table user(
    id  int(11) primary key auto_increment,
    name varchar(32) not null,
    mobile varchar(11) not null,
    regtime timestamp
);

index.php

<?php

define('BASEDIR',__DIR__);

include BASEDIR . '/IMooc/Loader.php';
spl_autoload_register('\\IMooc\\Loader::autoload');


/*$user = new \IMooc\User(1);
var_dump($user->id);
var_dump($user->name);
var_dump($user->mobile);
var_dump($user->regtime);
//如果没有使用数据对象的话,需要使用 SQL 语句
$user->name = 'test';
$user->mobile = '12345678901';
$user->regtime = date('Y-m-d H:i:s');*/

class Page
{
    public function index()
    {
        //使用工厂方法
//        $user = new \IMooc\User(1);
        $user = IMooc\Factory::getUser(1);
        $user->name = 'rango6666';
        var_dump(get_class($user) . __METHOD__);
        $this->test();
        echo 'Ok';
    }

    public function test()
    {
        //如果没有使用注册模式,又 new 一个对象,则下面的mobile 存不进去
//        $user = new IMooc\User(1);
        $user = IMooc\Factory::getUser(1);
        var_dump(get_class($user) . __METHOD__);
        $user->mobile = '6666';
        echo 'test';
    }
}

$page = new Page();
$page->index();

Factory.php

<?php

namespace IMooc;

class Factory
{
    static function createDatabase()
    {
        $db = Database::getInstance();
        //将 $db 映射到全局树上
        Register::set('db1',$db);
        return $db;
    }

    public static function getUser($id)
    {
        $key = 'user_' . $id;
        $user = Register::get($key);
        if(!$user){
            $user = new User($id);
            Register::set($key,$user);
        }
        return $user;
    }
}

MySQLi.php

<?php

namespace IMooc\Database;

use IMooc\IDatabase;

class MySQLi implements IDatabase
{
    protected $conn;

    public function connect($host,$user,$password,$dbname)
    {
        $conn = mysqli_connect($host,$user,$password,$dbname);
        $this->conn = $conn;
    }

    public function query($sql)
    {
        return mysqli_query($this->conn,$sql);
    }

    public function close()
    {
        mysqli_close($this->conn);
    }

}

User.php

<?php

namespace IMooc;

class User
{
    public $id;
    public $name;
    public $mobile;
    public $regtime;
    protected $db;

    public function __construct($id)
    {
        $this->db = new \IMooc\Database\MySQLi();
        $this->db->connect('localhost','root','123456','test1');
        $res = $this->db->query("select * from user where id=$id limit 1;");
        /*while($row = $res->fetch_row()){
            $rows[] = $row;
        }
        var_dump($rows);die;*/
        $data = $res->fetch_row();
        $this->id = $data[0];
        $this->name = $data[1];
        $this->mobile = $data[2];
        $this->regtime = $data[3];
    }

    public function __destruct()
    {
        var_dump('aa');
        //将属性的设置存入数据库
          $a = $this->db->query("update user set name='{$this->name}',
                                            mobile='{$this->mobile}',
                                            regtime='{$this->regtime}'
                                            where id={$this->id} limit 1
          ");
        var_dump($a);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值