热点网|医学教育网|北京pk10开奖直播 pk10开奖直播 北京赛车pk10 pk10开奖直播 北京赛车pk10 PK10开奖直播 北京赛车pk10开奖直播 北京pk10 北京pk10

PHP ORM框架与简单代码实现

让OOP与关系数据库更融洽
服务器君一共花费了163.826 ms进行了4次数据库查询,努力地为您提供了这个页面<。
试试阅读模式?希望听取您的建议

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

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

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

1<、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.jzjxzzjx.com/

2<、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整合起来。

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

3、EZPDO

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

官方网站:http://www.jzjxzzjx.com/blog/?p=2

4、RedBean

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

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

5、其他

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

总的来说>,一般ORM框架对付简单的应用系统来说都能满足基本需求<,可以大大降低开发难度<,提高开发效率,但是它在SQL优化方面,肯定是比纯SQL语言要差一些,对复杂关联>、SQL内嵌表达式的处理可能不是很理想。也许这主要是由于PHP本身对象持久化的问题,导致ORM效率过低>>,普遍比纯SQL要慢<。但是这些都是有办法解决的,最基本的解决性能的方案<<,我们可以通过缓存来提高效率<,Hibernate来说<,虽然配置比较繁杂,但是它通过灵活的使用二级缓存和查询缓存极大的缓解数据库的查询压力>,极大的提升了系统的性能。

如果你想自己实现一个PHP的ORM,下面的可以参考下:

<?php
abstract class Model{
   protected $pk = 'id';
   protected $_ID = null; 
   protected $_tableName;
   protected $_arRelationMap;
   protected $_modifyMap;
   protected $is_load = false;
   protected $_blForDeletion;
   protected $_DB;

   public function __consturct($id = null){
       $this->_DB = mysql_connect('127.0.0.1','root','') ;
       $this->_tableName = $this->getTableName();
       $this->_arRelationMap = $this->getRelationMap();
       if(isset($id))$this->_ID = $id;
   }
   abstract protected function getTableName();
   abstract protected function getRelationMap();

   public function Load(){
       if(isset($this->_ID)){
           $sql = "SELECT ";
           foreach($this->_arRelationMap as $k => $v){
               $sql .= '`'.$k.'`,';
           }
           $sql .= substr($sql,0,strlen($sql)-1);
           $sql .= "FROM ".$this->_tableName." WHERE ".$this->pk." = ".$this->_ID;
           $result =$this->_DB->mysql_query($sql);
           foreach($result[0] as $k1 => $v1){
              $member = $this->_arRelationMap[$key];
              if(property_exists($this,$member)){
                 if(is_numeric($member)){
                     eval('$this->'.$member.' = '.$value.';');
                 }else{
                     eval('$this->'.$member.' = "'.$value.'";');
                 }
              }
           }
       }
       $this->is_load = true;
   }
   public function __call($method,$param){
      $type   = substr($method,0,3);
      $member = substr($method,3);
      switch($type){
         case 'get':
             return $this->getMember($member);
             break;
         case 'set':
             return $this->setMember($member,$param[0]);
      }
      return false;
   }
   public function setMember($key){
       if(property_exists($this,$key)){
          if(is_numeric($val)){
             eval('$this->'.$key.' = '.$val.';');
          }else{
             eval('$this->'.$key.' = "'.$val.'";');
          }
          $this->_modifyMap[$key] = 1;
       }else{
          return false;
       }
   }
   
   public function getMember($key,$val){
       if(!$this->is_load){
          $this->Load();
       }
       if(property_exists($this,$key)){
          eval('$res = $this->'.$key.';' );
          return $this->$key;
       }
       return false;
   }

   public function save(){
      if(isset($this->_ID)){
          $sql = "UPDATE ".$this->_tableName." SET ";
          foreach($this->arRelationMap as $k2 => $v2){
              if(array_key_exists( $k2, $this->_modifyMap)){
                  eval( '$val = $this->'.$v2.';');
                  $sql_update .=  $v2." = ".$val;
              }
          }
          $sql .= substr($sql_update,0,strlen($sql_update));
          $sql .= 'WHERE '.$this->pk.' = '.$this->_ID;
      }else{
          $sql = "INSERT INTO ".$this->_tableName." (";
          foreach($this->arRelationMap as $k3 => $v3){
              if(array_key_exists( $k3,$this->_modifyMap)){
                  eval('$val = $this->'.$v3.';');
                  $field  .= "`".$v3."`,"; 
                  $values .= $val;
              }
          }
          $fields = substr($field,0,strlen($field)-1);
          $vals   = substr($values,0,strlen($values)-1);
          $sql .= $fields." ) VALUES (".$vals.")";
      }
      echo $sql;
      //$this->_DB->query($sql);
   }
   public function __destory(){
      if(isset($this->ID)){
         $sql = "DELETE FROM ".$this->_tableName." WHERE ".$this->pk." = ".$this->_ID;
        // $this->_DB_query($sql);
      }
   }
}

class User extends Model{
    protected  function getTableName(){
       return "test_user";
    }
    protected function getRelationMap(){
        return array( 
                      'id'       => USER_ID,
                      'user_name'=> USER_NAME,
                      'user_age' => USER_AGE
                    );
    }
    public function getDB(){
       return $this->_DB;
    }
}

$UserIns = new User();
print_r($UserIns);

?>

本文地址:http://www.jzjxzzjx.com/librarys/veda/detail/2169>><,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.jzjxzzjx.com/librarys/veda/detail/2169

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏。

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低>,我觉得一个重要原因是看的书少了。多少是多呢>?起码得看3>、4、5、6米吧。给个具体的数量<,那就100本书吧<>。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构>,系统化以后就足以应对大量未曾遇到过的问题<<<。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话<,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官<,但是在知识结构体系以及心理上我们就居高临下<。

所以,阅读一百本计算机著作吧>,少年><!

《C程序设计语言(第2版新版)》 克尼汉 (作者), 等 (作者, 译者), 徐宝文 (译者)

《C程序设计语言》(第2版新版)是由C语言的设计者Brian W.Kernighan和Dennis M.Ritchie编写的一部介绍标准C语言及其程序设计方法的权威性经典著作<>。全面、系统地讲述了C语言的各个特性及程序设计的基本方法<,包括基本概念,类型和表达式、控制流>、函数与程序结构、指针与数组>、结构、输入与输出>>、UNIX系统接口、标准库等内容。

更多计算机宝库...

  • 港媒称台战机“日晒雨淋” 台军将领出面否认 2018-05-22
  • 怎样和陈意涵袁姗姗一样拥有完美裸妆肤感? 2018-05-22
  • 《东北树木彩色图志》首次载入我国新发现植物“青姬木” 2018-05-22
  • 网约车司机无证上岗拟纳入失信黑名单无证司机失信 2018-05-20
  • 300余名澳门中学生参加国旗手训练营(组图) 2018-05-20
  • 法前总统萨科齐遭拘 或因利比亚前要人递新证据 2018-05-20
  • 美媒称中国新人婚纱摄影很疯狂:有的仿如电影拍摄现场 2018-05-19
  • 立陶宛举行“汉语桥”中文比赛 2018-05-19
  • 上海嘉禾2017秋季艺术品拍卖会 2018-05-18
  • 海归回国就业创业遇到困难怎么办他帮海归找工作就业创业留学生海归 2018-05-18
  • 扛不住了?台当局拟放宽许可条件鼓励陆客赴台 2018-05-17
  • 美名校毕业典礼竞邀女性演讲者 希拉里将前往耶鲁希拉里耶鲁演讲者 2018-05-16
  • 空姐遇害案告破!DNA鉴定打捞尸体确系嫌犯刘某华 2018-05-16
  • 44年前创举!美军运输机曾空射洲际导弹 2018-05-16
  • 中部新一线城市扩容 产业定位“只看高端” 2018-05-15
  • ASP300源码下载 | 微信红包群 | 设计 | 冠珠陶瓷 | 科技 | 北京赛车pk10微信源码 | 挖段子网 | 厦门旅游景点 | 旅游中国新闻网 | 钛媒体 | 健康网hsdcba | 每天资讯 | 广西农业技术信息 | 农业种植技术 |