国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

多種php ORM框架介紹及簡單實例代碼

2020-03-22 20:31:23
字體:
供稿:網(wǎng)友
  •  對象關(guān)系映射(Object Relational Mapping,簡稱ORM)是一種為了解決html' target='_blank'>面向?qū)ο?/u>與關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。 簡單的說,ORM是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形 式。

    ORM提供了所有SQL語句的生成,代碼人員遠(yuǎn)離了數(shù)據(jù)庫概念。從一個概念需求(例如一個HQL)映射為一個SQL語句,并不需要什么代價,連1%的性能損失都沒有。真正的性能損失在映射過程中,更具體地講,是在對象實例化的過程中www.it165.net。

    目前PHP 開源比較有名的 ORM 有以下幾個:

    1、Propel

    Propel是一個適用于PHP5的ORM映射(Object Relational Mapping)框架,它基于Apache Torque提供對象持久層支持。它通過XML格式的模式定義文件和相應(yīng)的配置文件來生成SQL和類,它允許你使用對象代替SQL來讀寫數(shù)據(jù)庫表中的記 錄。Propel提供一個生成器來為你的數(shù)據(jù)模型創(chuàng)建SQL定義文件和PHP類。開發(fā)者也可以十分簡單的定制生成的類,我們還可以通過XML, PHP類和Phing構(gòu)建工具把Propel集成到已有的應(yīng)用開發(fā)框架中去.例如PHP框架symfony的1.2以前的版本就是默認(rèn)使用了精簡版的 Propel作為默認(rèn)ORM框架。

    官方網(wǎng)站:http://www.propelorm.org/

    2、Doctrine

    Doctrine是一個PHP的ORM框架,它必須運行在>=php5.2.3版本上,它是一個功能強大的數(shù)據(jù)抽象層。

    它的一個主要特征就是使用面向?qū)ο蟮姆绞絹韺崿F(xiàn)數(shù)據(jù)庫查詢的封轉(zhuǎn),它底層通過一個類似 Hibernate HQL的DQL的查詢語句進(jìn)行數(shù)據(jù)庫查詢,這使得開發(fā)的靈活性更強,大大減小了重復(fù)代碼。相比Propel,Doctrine的優(yōu)點在于它支持支持全文檢 索,Doctrine的文檔一直就比Propel要全面豐富,社區(qū)更活躍,而且使用起來更加自然、更易閱讀、更接近原生SQL。性能方面也略微優(yōu)于 Propel。同樣你也可以可以很方便的把Doctrine集成到現(xiàn)有的應(yīng)用框架中去,比如PHP框架symfony的1.3以后的版本將 Doctrine作為默認(rèn)的ORM框架,同時也可以將Doctrine和Codeigniter整合起來。

    官方網(wǎng)站: http://www.doctrine-project.org/

    3、EZPDO

    EZPDO是一個十分輕量級的PHP ORM框架。EZPDO的作者的本意旨在降低復(fù)雜的ORM學(xué)習(xí)曲線,盡可能在ORM的運行效率和功能之間做一個平衡點,它是我至今用過的最簡單的ORM框 架,我目前還想將它集成到我的CoolPHP SDK中來,而且運行效率相當(dāng)不錯,功能也基本能滿足需求,只不過ESPDO的更新比較緩慢。

    官方網(wǎng)站:http://www.ezpdo.net/blog/?p=2

    4、RedBean

    RedBean是一個易于使用,輕量級PHP ORM框架,提供對MySQL, SQLite&PostgreSQL的支持。RedBean架構(gòu)非常靈活,核心也非常簡約,開發(fā)者可以很方便的通過插件來擴展功能。

    官方網(wǎng)站:http://www.redbeanphp.com/

    5、其他

    國內(nèi)的fleaphp開發(fā)框架基于TableDataGateway實現(xiàn)ORM實現(xiàn);Zend Framework除了提供對 SQL 語句的封裝以外,也同樣實現(xiàn)了TableGateway、TableRowSet、TableRow的實現(xiàn);還有一些類似Rails的 ActiveRecord實現(xiàn)的解決方案。

    總的來說,一般ORM框架對付簡單的應(yīng)用系統(tǒng)來說都能滿足基本需求,可以大大降低開發(fā)難度,提高開發(fā)效率,但是它在SQL優(yōu)化方面,肯定是比純 SQL語言要差一些,對復(fù)雜關(guān)聯(lián)、SQL內(nèi)嵌表達(dá)式的處理可能不是很理想。也許這主要是由于PHP本身對象持久化的問題,導(dǎo)致ORM效率過低,普遍比純 SQL要慢。但是這些都是有辦法解決的,最基本的解決性能的方案,我們可以通過緩存來提高效率,Hibernate來說,雖然配置比較繁雜,但是它通過靈 活的使用二級緩存和查詢緩存極大的緩解數(shù)據(jù)庫的查詢壓力,極大的提升了系統(tǒng)的性能。

    如果你想自己實現(xiàn)一個PHP的ORM,下面的可以參考下:

    <?phpabstract 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('http://www.xiaocainiao.net','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);?>

    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 阳曲县| 灯塔市| 山西省| 乾安县| 新源县| 敦化市| 葵青区| 阜南县| 微山县| 历史| 昌邑市| 股票| 荆门市| 庆城县| 平阳县| 南木林县| 诏安县| 曲水县| 平塘县| 大邑县| 当雄县| 阳西县| 绥德县| 得荣县| 图片| 贵阳市| 沙湾县| 富阳市| 马公市| 郸城县| 布尔津县| 石狮市| 绥宁县| 子洲县| 句容市| 夏邑县| 拜城县| 庆云县| 什邡市| 怀集县| 平度市|