php中的设计模式中有很多的各种模式了,在这里我们来为各位介绍一个不常用的数据映射模式吧,希望文章能够帮助到各位。
数据映射模式使您能更好的组织你的应用程序与数据库进行交互。
数据映射模式将对象的属性与存储它们的表字段间的结合密度降低。数据映射模式的本质就是一个类,它映射或是翻译类的属性或是方法到数据库的相应字段,反之亦然。
数据映射的作用(工作)就在于能对双方所呈现出的信息的理解,并能对信息的存取进行控制,如根据存储在数据表中的信息
重建新的域对象,或是用域对象的信息来更新或删除数据表中的相关数据。
对于面向对象代码与数据库表和字段间的映射关系的存储有多种实现方式。其中一种可能的方法就通过手工编码将这种映射关系存储在数据映射类中。
另一种可选的方法是用PHP的数组并将其编码为类本身。这个类也能外源获取数据,如INI或是XML文件。
数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。
在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作。对象关系映射(Object Relational Mapping,ORM)
ha_cl表
Hacl.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php
namespace Baobab;
class Hacl{
public $id ;
public $haclname ;
public $haclcode ;
public $hacls ;
protected $db ;
function __construct( $id ){
$this ->db = new \Baobab\Database\Mysqli();
$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
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php
namespace Baobab;
class Factory{
static function getHacl( $id ){
$key = 'user_' . $id ;
$user = \Baobab\Register::get( $key ); //表中id不同表示的是不同的对象
if (! $user ){
$user = new \Baobab\Hacl( $id );
\Baobab\Register::set( $key , $user );
}
return $user ;
}
}
|
Register.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Page{
function index(){
$hacl = Baobab\Factory::getHacl(13);
$hacl ->haclname = '测试名称' ;
$this ->test();
echo 'ok' ;
}
function test(){
$hacl = Baobab\Factory::getHacl(13);
$hacl ->hacls = '测试内容' ;
}
}
$page = new Page();
$page ->index();
|
使用工厂模式会多次创建对象Hacl,浪费资源,如果将对象作为参数传递,一方面会带来额外的使用成本,另外如果很多地方都用到这个对象很容易发生错误,因此在工厂模式中使用注册树模式来解决这个问题。
以上内容给大家介绍了php设计模式之数据对象映射模式,希望对大家有所帮助!