php中的设计模式中有很多的各种模式了,在这里我们来为各位介绍一个不常用的数据映射模式吧,希望文章能够帮助到各位。
php数据映射模式,看名字就知道,主要用到数据应用操作,实现对象关系映射。
数据映射模式,对象关系映射(Object Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统的数据之间的转换。
一般ORM框架对付简单的应用系统来说都能满足基本需求,可以大大降低开发难度,提高开发效率,但是它在SQL优化方面,肯定是比纯SQL语言要差很多,对复杂关联、SQL内嵌表达式的处理都不是很理想。
目前使用的TP框架,其核心文件Model.class.php就是实现了ORM和ActiveRecords模式,在项目中所有的模型也都是继承这个模型类。
首先,实现一个数据库中间层实现类,使用pdo进行数据库访问。
创建一个DB类文件 Db.class.php
 
复制代码 代码示例:
<?php
/*
 * 数据库中间层实现类
 */
class Db { 
public static $db = null; 
private $_dbh = null; 
public static function getInstance() { 
if( self::$db == null ){ 
self::$db = new self(BACKEND_DBHOST ,BACKEND_DBUSER ,BACKEND_DBPW ,BACKEND_DBNAME); 
} 
return self::$db; 
}
  
private function __construct( $host ,$user ,$pass ,$dbname ){ 
try { 
$this->_dbh = new PDO('
mysql:dbname='.$dbname.';host='.$host,$user,$pass); 
$this->_dbh->query('SET NAMES '. BACKEND_DBCHARSET); 
$this->_dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); 
$this->_dbh->setAttribute(PDO::ATTR_ERRMODE, true); 
} <a href="/tags.php/catch/" target="_blank">catch</a> (PDOException $e) { 
throw new Exception('Can not connect db'); 
} 
}
public function getOne($sql){ 
try { 
$rs = $this->_dbh->query($sql); 
$result = $rs->fetch(PDO::FETCH_ASSOC); 
if(!empty($result)) { 
return $result; 
} 
} catch (PDOException $e) { 
throw new Exception($this->_dbh->errorInfo()); 
} 
return false; 
} 
  
public function getAll($sql){ 
try { 
$rs = $this->_dbh->query($sql); 
$result = $rs->fetchAll(PDO::FETCH_ASSOC); 
if(!empty($result)) { 
return $result; 
} 
} catch (PDOException $e) { 
throw new Exception($this->_dbh->errorInfo()); 
} 
return false; 
} 
  
public function exec($sql){ 
try { 
$exec = $this->_dbh->exec($sql); 
} catch (PDOException $e){ 
throw new Exception($this->_dbh->errorInfo()); 
} 
return $exec;
}
  
public function getLastId() 
{ 
return $this->_dbh->lastInsertId(); 
} 
} 
?>
2、数据映射类 Table.class.php
 
复制代码 代码示例:
<?php
/** 
 * 数据映射类
 * 部分代码来源TP框架
 * 使用相关魔术方法 则映射的表修改字段后无需修改属性值
 */ 
class Table{
  
// 数据信息
protected $data = array();
  
// 数据信息
protected $db = null;
  
// 表信息
protected $tableName = '';
public function __construct() {
$this->db = Db::getInstance();
}
  
/**
 * 设置数据对象的值
 */
public function __set($name,$value) {
// 设置数据对象属性
$this->data[$name] = $value;
}
/**
 * 获取数据对象的值
 */
public function __get($name) {
return isset($this->data[$name])?$this->data[$name]:null;
}
  
/*
 * 添加
 * 修改、删除也和添加类似,就不一一列举了
 */
public function add() {
$data = $this->data;
<a href="/tags.php/foreach/" target="_blank">foreach</a>($data as $k=>$v) {
$fieldArr[] = $k;
$valueArr[] = "'".$v."'";
}
$fields = implode(',', $fieldArr);
$values = implode(',', $valueArr);
$sql = 'INSERT INTO '.$this->tableName.' ('.$fields.') VALUES ('.$values.')';
$result = $this->db->exec($sql);
if($result) {
return $this->db->getLastId();
} else {
return false;
}
}
}
?>
3、表对应的类文件 UserTable.class.php
 
复制代码 代码示例:
<?php
/** 
 * 数据映射到表 
 * 一般根据表的结构由工具自动生成,比如Yii框架等。
 */
class UserTable extends Table { 
protected $tableName = 'user';
}
?>
 
  
使用方式 index.php
 
复制代码 代码示例:
<?php
/** 
 * 数据库配置文件 
 */ 
define('BACKEND_DBHOST', 'localhost'); 
define('BACKEND_DBUSER', 'root'); 
define('BACKEND_DBPW', ''); 
define('BACKEND_DBNAME', 'test'); 
define('BACKEND_DBCHARSET', 'utf-8');
/*
 * 这里实例化对象时可以使用之前介绍的
工厂模式和注册模式,来实例化和管理实例化对象
 * TP框架中的D方法就是做了这部分工作
 */
$UserTable = new UserTable();
$UserTable->username = 'Anrai';
$UserTable->mobile = '123456789';
$UserTable->email = 'huanglei.web@gmail.com';
echo $UserTable->add();
/*
数据表sql
CREATE TABLE `user` (
 `uid` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(30) NOT NULL,
 `mobile` varchar(11) NOT NULL DEFAULT '0',
 `email` varchar(60) NOT NULL DEFAULT '0',
 PRIMARY KEY (`uid`),
 KEY `username` (`username`)
) ENGINE=
innodb DEFAULT CHARSET=latin1
*/
?>