Doctrine:PHP的ORM解決方案
也因此,所謂的ORM(Object-Relation Mapping)、Active Record的Design Pattern應運而生,其目的在於減少SQL指令跟主程式之間的藕合性,採用集中管理或是代理操作機制來讓程式碼與關聯式資料庫間溝通,開發者只要透過原來在使用的開發語言,不必接觸到實際的SQL,就能夠完成增、刪、改、查等跟資料庫之間的操作,不但減少了開發的時間,也降低的以後維護的成本。
在所有的有關資料庫的資訊系統中,與資料庫之間的操作一直都是程式設計師在架構上設計的一個難題,因為跟資料庫之間溝通的語言SQL,與一般我們在使用的程式語言像是Java、C#、或是PHP在結構上就是根本完全不同的東西,當使用者在操作資料庫的時候,必須在程式碼中插入這些沒有結構化的SQL指令,這對程式未來的維護而言是一大傷害。
也因此,所謂的ORM(Object-Relation Mapping)、Active Record的Design Pattern應運而生,其目的在於減少SQL指令跟主程式之間的藕合性,採用集中管理或是代理操作機制來讓程式碼與關聯式資料庫間溝通,開發者只要透過原來在使用的開發語言,不必接觸到實際的SQL,就能夠完成增、刪、改、查等跟資料庫之間的操作,不但減少了開發的時間,也降低的以後維護的成本。
其中O-R Mapping的概念勢將資料庫的結構與內容,映射成符合開發者物件導向語言的物件來操作。
舉例來說,有一個User的資料表,裡面有4個欄位,分別是姓名(name)、性別(gender)、電話(tel)和密碼(passwd),主鍵為姓名。
如果我們要取得姓名為Derek Hsu的使用者,過去用Sql指令的話,我們可能必須在程式碼中加入以下的這行SQL指令:
SELECT name, gender, tel, passwd FROM User WHERE name='Derek Hsu'
如果你程式中的五、六個地方都用到類似的物件,那麼你當資料庫欄位需要修改時,在維護上就會讓人相當頭痛,因為你必須要在這五個地方找到這些東西。類似的東西你可以在discuz這類的論壇原始碼中看到。
而如果用ORM的的結構來完成的話,以PHP為例,我們可以用這樣的方式來完成:
$user=Factory::getModel('User')->find('Derek Hsu')
$name=$user->name;
$passwd=$user->passwd;
這樣的好處是很明顯的,除了維護上簡化許多以外,整個程式的可讀性也提高了,變得更加的結構化。
以往PHP遭人詬病的一項缺點就是缺乏結構性,但是實際的原因並不是出在PHP本身,而是出在使用者,PHP本身提供了不結構性的方式來撰寫程式,但是使用者仍然可以很有架構性的來使用PHP,並且利用PHP的簡潔特性,讓PHP發揮更大的功能。
Doctrine目前的Stable版本的0.11版,目前的正式1.0版已經進入Beta測試階段,目前台灣還沒有有關於Doctrine的相關資源,可能是台灣的PHP開發者還沒有習慣使用ORM的工具來完成工作的緣故。
未來有機會的話,希望能夠寫一篇Doctrine的實戰指南,談一下如何應用Doctrine在目前的PHP專案開發當中,以及如何與其她的Framework像是Zend Framework的整合。
Popularity: 2% [?]

