php orm 实现,PHP ORM框架与简单代码实现

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是经过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另一种形式。php

ORM提供了全部SQL语句的生成,代码人员远离了数据库概念。从一个概念需求(例如一个HQL)映射为一个SQL语句,并不须要什么代价,连1%的性能损失都没有。真正的性能损失在映射过程当中,更具体地讲,是在对象实例化的过程当中。mysql

目前PHP 开源比较有名的 ORM 有如下几个:sql

一、Propel

Propel是一个适用于PHP5的ORM映射(Object Relational Mapping)框架,它基于Apache Torque提供对象持久层支持。它经过XML格式的模式定义文件和相应的配置文件来生成SQL和类,它容许你使用对象代替SQL来读写数据库表中的记录。Propel提供一个生成器来为你的数据模型建立SQL定义文件和PHP类。开发者也能够十分简单的定制生成的类,咱们还能够经过XML, PHP类和Phing构建工具把Propel集成到已有的应用开发框架中去.例如PHP框架symfony的1.2之前的版本就是默认使用了精简版的Propel做为默认ORM框架。数据库

官方网站:http://www.propelorm.org/缓存

二、Doctrine

Doctrine是一个PHP的ORM框架,它必须运行在>=php5.2.3版本上,它是一个功能强大的数据抽象层。架构

它的一个主要特征就是使用面向对象的方式来实现数据库查询的封转,它底层经过一个相似 Hibernate HQL的DQL的查询语句进行数据库查询,这使得开发的灵活性更强,大大减少了重复代码。相比Propel,Doctrine的优势在于它支持支持全文检索,Doctrine的文档一直就比Propel要全面丰富,社区更活跃,并且使用起来更加天然、更易阅读、更接近原生SQL。性能方面也略微优于Propel。一样你也能够能够很方便的把Doctrine集成到现有的应用框架中去,好比PHP框架symfony的1.3之后的版本将Doctrine做为默认的ORM框架,同时也能够将Doctrine和Codeigniter整合起来。app

官方网站: http://www.doctrine-project.org/框架

三、EZPDO

EZPDO是一个十分轻量级的PHP ORM框架。EZPDO的做者的本意旨在下降复杂的ORM学习曲线,尽量在ORM的运行效率和功能之间作一个平衡点,它是我至今用过的最简单的ORM框架,我目前还想将它集成到个人CoolPHP SDK中来,并且运行效率至关不错,功能也基本能知足需求,只不过ESPDO的更新比较缓慢。工具

官方网站:http://www.ezpdo.net/blog/?p=2性能

四、RedBean

RedBean是一个易于使用,轻量级PHP ORM框架,提供对MySQL, SQLite&PostgreSQL的支持。RedBean架构很是灵活,核心也很是简约,开发者能够很方便的经过插件来扩展功能。

官方网站:http://www.redbeanphp.com/

五、其余

国内的fleaphp开发框架基于TableDataGateway实现ORM实现;Zend Framework除了提供对 SQL 语句的封装之外,也一样实现了TableGateway、TableRowSet、TableRow的实现;还有一些相似Rails的ActiveRecord实现的解决方案。

总的来讲,通常ORM框架对付简单的应用系统来讲都能知足基本需求,能够大大下降开发难度,提升开发效率,可是它在SQL优化方面,确定是比纯SQL语言要差一些,对复杂关联、SQL内嵌表达式的处理可能不是很理想。也许这主要是因为PHP自己对象持久化的问题,致使ORM效率太低,广泛比纯SQL要慢。可是这些都是有办法解决的,最基本的解决性能的方案,咱们能够经过缓存来提升效率,Hibernate来讲,虽然配置比较繁杂,可是它经过灵活的使用二级缓存和查询缓存极大的缓解数据库的查询压力,极大的提高了系统的性能。

若是你想本身实现一个PHP的ORM,下面的能够参考下:

001

002

abstract class Model{

003

protected $pk ='id';

004

protected $_ID = null;

005

protected $_tableName;

006

protected $_arRelationMap;

007

protected $_modifyMap;

008

protected $is_load = false;

009

protected $_blForDeletion;

010

protected $_DB;

011

012

public function __consturct($id = null){

013

$this->_DB = mysql_connect('127.0.0.1','root','') ;

014

$this->_tableName =$this->getTableName();

015

$this->_arRelationMap =$this->getRelationMap();

016

if(isset($id))$this->_ID =$id;

017

}

018

abstract protected function getTableName();

019

abstract protected function getRelationMap();

020

021

public function Load(){

022

if(isset($this->_ID)){

023

$sql ="SELECT ";

024

foreach($this->_arRelationMapas $k =>$v){

025

$sql .='`'.$k.'`,';

026

}

027

$sql .=substr($sql,0,strlen($sql)-1);

028

$sql .="FROM ".$this->_tableName." WHERE ".$this->pk." = ".$this->_ID;

029

$result =$this->_DB->mysql_query($sql);

030

foreach($result[0]as $k1 =>$v1){

031

$member =$this->_arRelationMap[$key];

032

if(property_exists($this,$member)){

033

if(is_numeric($member)){

034

eval('$this->'.$member.' = '.$value.';');

035

}else{

036

eval('$this->'.$member.' = "'.$value.'";');

037

}

038

}

039

}

040

}

041

$this->is_load = true;

042

}

043

public function __call($method,$param){

044

$type   =substr($method,0,3);

045

$member =substr($method,3);

046

switch($type){

047

case 'get':

048

return $this->getMember($member);

049

break;

050

case 'set':

051

return $this->setMember($member,$param[0]);

052

}

053

return false;

054

}

055

public function setMember($key){

056

if(property_exists($this,$key)){

057

if(is_numeric($val)){

058

eval('$this->'.$key.' = '.$val.';');

059

}else{

060

eval('$this->'.$key.' = "'.$val.'";');

061

}

062

$this->_modifyMap[$key] = 1;

063

}else{

064

return false;

065

}

066

}

067

068

public function getMember($key,$val){

069

if(!$this->is_load){

070

$this->Load();

071

}

072

if(property_exists($this,$key)){

073

eval('$res = $this->'.$key.';' );

074

return $this->$key;

075

}

076

return false;

077

}

078

079

public function save(){

080

if(isset($this->_ID)){

081

$sql ="UPDATE ".$this->_tableName." SET ";

082

foreach($this->arRelationMapas $k2 =>$v2){

083

if(array_key_exists($k2,$this->_modifyMap)){

084

eval('$val = $this->'.$v2.';');

085

$sql_update .=$v2." = ".$val;

086

}

087

}

088

$sql .=substr($sql_update,0,strlen($sql_update));

089

$sql .='WHERE '.$this->pk.' = '.$this->_ID;

090

}else{

091

$sql ="INSERT INTO ".$this->_tableName." (";

092

foreach($this->arRelationMapas $k3 =>$v3){

093

if(array_key_exists($k3,$this->_modifyMap)){

094

eval('$val = $this->'.$v3.';');

095

$field  .="`".$v3."`,";

096

$values .=$val;

097

}

098

}

099

$fields =substr($field,0,strlen($field)-1);

100

$vals   =substr($values,0,strlen($values)-1);

101

$sql .=$fields." ) VALUES (".$vals.")";

102

}

103

echo $sql;

104

//$this->_DB->query($sql);

105

}

106

public function __destory(){

107

if(isset($this->ID)){

108

$sql ="DELETE FROM ".$this->_tableName." WHERE ".$this->pk." = ".$this->_ID;

109

// $this->_DB_query($sql);

110

}

111

}

112

}

113

114

class Userextends Model{

115

protected  function getTableName(){

116

return "test_user";

117

}

118

protected function getRelationMap(){

119

return array(

120

'id'       => USER_ID,

121

'user_name'=> USER_NAME,

122

'user_age' => USER_AGE

123

);

124

}

125

public function getDB(){

126

return $this->_DB;

127

}

128

}

129

130

$UserIns =new User();

131

print_r($UserIns);

132

133

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值