Propel
http://propel.phpdb.org/
Propel是一個基於Apache Torque的對象持久層,需要PHP5支援.實際上,它讓你使用 對象 代替SQL 來讀寫資料庫表中的記錄.它提供了一個產生器來建立基於你的資料模型的SQL定義檔案和相應的類檔案,並有一個運行時引擎透明的處理對象持久和擷取工作.如果要定製產生的類將是很簡單的事情,XML, PHP類 和Phing構建工具使得把Propel整合到已有的應用程式架構也相當的容易.
Propel算是PHP中對ORM的實現,並且用到它的兄弟項目Creole作為資料抽象層.
它的核心思想是:通過 XML 格式的模式檔案和相應的設定檔來產生SQL和類, 在資料庫抽象的基礎上, 更近一步,它"隱藏"了資料庫,使得WEB開發人員專註於商務邏輯上.實踐:著名PHP架構 symfony使用了精簡版的Propel.相關:PEAR DB_DataObject是另一個輕型的ORM實現,不過它的資料庫抽象層使用的是 PEAR DB.EZPDO
http://www.ezpdo.net
EZPDO 是一個輕量級的PHP ORM架構。旨在降低複雜的學習曲線,維持一個相當的運行速度和提供儘可能強大的功能。不過作者更新比較慢。好幾個月才能更新一個小版本。
以下引用自官方網站
Features 特性
Here is a quick look at the features in EZPDO before you delve into any details.
- Minimum SQL knowledge required
- 儘可能的SQL透明
- Requires minimum ORM specification
- 最小化的ORM配置
- No Phing! No need of explicit command line compile
- 不需要複雜的命令列操作
- Works with existing code and database
- 工作在已有的資料庫和代碼的基礎上
- Has a small runtime core to guarentee performance
- 有一個小的運行時核心以提高效能
- Handles 1:N, and M:N relationships automatically
- 可以自動處理1:N,M:N 的關係
- Provides a simple runtime API
- 提供一個簡單易懂的運行時API
- Supports object query (EZOQL)
- 支援物件查詢(EZOQL) 注: 仿照 Hibernate 的 HQL 起的名字,貌似未完全實現
- Auto generates database tables
- 自動產生資料庫表
- Test-driven with continuous integration
- 持續整合的測試驅動
Licence
EZPDO is an open source project and uses the BSD license.
BSD協議意味著你可以自由的使用,修改該軟體源碼,需要在你發布的源碼包中包含BSD協議或者註明。
ORM in Frameworks
許多開發架構都對ORM有實現。
Picora 提供了一個類 ActiveRecord 的實現,同時提供了一個緩衝和序列化的實現。當前的版本是 0.4 版。
ThinkPHP 是國內鼎鼎大名的PHP開源架構之一,在模板引擎上模仿了 Struts 。它提供了名為 VO ( ValueObject ) 的 ORM 實現,由於沒有看過源碼,從使用方式上看,它的實現和 ezpdo 有一定類似之處。
FleaPHP 是國內另外一個著名的PHP開源架構,作者廖宇雷大俠(dualface),脾氣火暴。它提供了TableGateWay方式的 ORM 實現。
Zend Framework (ZF) 是 PHP 老母 Zend 公司的傑作,目前已經公布了 1.0 production 版,除了提供對 SQL 陳述式的封裝以外,也同樣實現了 TableGateway 、 TableRowSet 、 TableRow 的實現。
總結
從功能上講,不管是 ActiveRecord 模式,還是 TableGateway ,對付簡單的查詢的確是可以降低開發難度,提高開發效率;但是它們對複雜關聯、SQL內嵌運算式的處理都不好。另外,由於php的對象持久化功能較弱,導致ORM的速度令人不敢恭維,測試結果普遍大約比Native SQL 慢10~50倍。
在大型項目中,期望使用ORM ,但是有可能出現的複雜情況讓我對 ORM 心存恐懼。如果強制使用 Pure SQL 很有可能會帶來資料緩衝的衝突和 ORM 內部關聯的破壞。
這些讓我感到很失望,RDBMS 難道果真不是為了OO設計的。沒有仔細的看過Hibernate ,不知道Hibernate的處理究竟有多強,但Hibernate 那繁雜的設定檔讓人望而生畏,我想這同樣不是ORM的真諦。
Django 中的 Models 模型雖然功能要比 Python 中最強大的 SQLAlchemy差一些,而且寫法也有些類似ZF中的db_select 但是藉於Python強大的自省功能, Django 的 Models 仍然是一個寫法優美、便於使用的ORM 。粗略得想,我認為把 Django的 ORM 移植到 PHP 不會是很難的事情,但目前的我做到這點還有很大差距,所以期望有心人可以做這麼一次有益的嘗試。