新知一下
海量新知
6 5 1 7 5 9 6

[精选] ORM实现机制其实就是php的数据对象映射模式,不妨看看

php自学中心 | 用编程思想感受你的生活 2022/09/06 12:39

设计模式,是每个程序员必须知道,必须学习的知识,虽然不算是基础,但是你必须要懂得。

什么是数据对象映射模式

数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。

在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作。对象关系映射(Object Relational Mapping,ORM) 就是PHP框架中的模型。

数据对象映射模式 的好处

数据映射模式将对象的属性与存储它们的表字段间的结合密度降低。数据映射模式的本质就是一个类,它映射或是翻译类的属性或是方法到数据库的相应字段,反之亦然。

数据映射的作用(工作)就在于能对双方所呈现出的信息的理解,并能对信息的存取进行控制,如根据存储在数据表中的信息

重建新的域对象,或是用域对象的信息来更新或删除数据表中的相关数据。

对于面向对象代码与数据库表和字段间的映射关系的存储有多种实现方式。其中一种可能的方法就通过手工编码将这种映射关系存储在数据映射类中。另一种可选的方法是用PHP的数组并将其编码为类本身。这个类也能外源获取数据,如INI或是XML文件。

代码实例如下:

ha_cl表

新知达人, [精选]  ORM实现机制其实就是php的数据对象映射模式,不妨看看

Hacl.php

<?php

namespace Baobab;

class Hacl{

public $id;

public $haclname;

public $haclcode;

public $hacls;

protected $db;

function __construct($id){

$this->db = new BaobabDatabaseMysqli();

$this->db->connect('127.0.0.1''root''''test');

$res = $this->db->query("select * from ha_cl where id = {$id}");

$data = $res->fetch_assoc();

$this->id = $data['ID'];

$this->haclname = $data['ha_cl_name'];

$this->haclcode = $data['ha_cl_code'];

$this->hacls = $data['hacls'];

}

function __destruct(){

$this->db->query("update ha_cl set

ha_cl_code = '{$this->haclcode}',

ha_cl_name = '{$this->haclname}',

hacls = '{$this->hacls}'

where ID = {$this->id}

limit 1"
);

}

}

Factory.php

<?php

namespace Baobab;

class Factory{

static function getHacl($id){

$key = 'user_'.$id;

$user = BaobabRegister::get($key);//表中id不同表示的是不同的对象

if(!$user){

$user = new BaobabHacl($id);

BaobabRegister::set($key, $user);

}

return $user;

}

}

Register.php

<?php

namespace Baobab;

class Register{

protected static $objects;

static function set($alias, $object){

self::$objects[$alias] = $object;

}

static function _unset($alias) {

unset(self::$objects[$alias]);

}

static function get($name) {

return self::$objects[$name];

}

}

index.php

class Page{

    function index(){

        $hacl = BaobabFactory::getHacl(13);

        $hacl->haclname = '测试名称';

        $this->test();

        echo 'ok';

    }

    function test(){

        $hacl = BaobabFactory::getHacl(13);

        $hacl->hacls = '测试内容';

    }

}

$page = new Page();

$page->index(); 

使用工厂模式会多次创建对象Hacl,浪费资源,如果将对象作为参数传递,一方面会带来额外的使用成本,另外如果很多地方都用到这个对象很容易发生错误,因此在工厂模式中使用注册树模式来解决这个问题。



更多“设计模式”相关内容

更多“设计模式”相关内容

新知精选

更多新知精选