為書寫方便,下面將Delphi for PHP簡寫為D4P。
其實現在寫這篇評測稍早了一些,因為這個IDE以及使用的開發框架Vcl for PHP都才剛推出不過一個月。
首先請先回顧一下關於三種主流WEB架構的思考 一文所說的三種web開發方式,使用D4P開發是典型的第三種方式,就是IDE+基於控件、事件驅動的開發框架。
我根據D4P的DEMO,設計了兩個程序,一個是普通的表單提交-返回程序,然後我所熟悉的QuickForm進行了對比;另一個是數據庫程序,就是查詢一個MySQL表,然後返回,另外試用DataGrid列出數據。
在寫測試程序的過程中,除了熟悉和體驗一下IDE的使用,其實我更感興趣的是Delphi for PHP這個IDE所采用的PHP開發框架――Vcl for PHP(http://www.qadram.com/vcl4php/)。在我使用D4P之前,我就猜測Codegear在易用性上一定不錯,這個猜測得到了證實。但是Vcl for PHP是否是一個優秀的PHP框架? 如果沒有優秀的開發框架,不能保證程序的質量和效率,那麼光靠個優秀的IDE,開發出來的程序一定是中看不中用,沒人敢用。
基於這個想法,我認真研究了一下VCL for PHP(簡稱為V4P)。這個框架2007年3月27才開源的,也就是說開源不到一個月。框架文件位於C:Program FilesCodeGearDelphi for PHP1.0vcl目錄,或者你也可以在http://www.qadram.com/vcl4PHP/網站上下載到。
我們可以看到,V4P使用了很多我們熟悉的PHP開源類庫,例如ADODB、Smarty、XAJax、Nusoap等等,還使用了qooxdoo這個JS GUI工具包。也可以看到一些似乎還未完成的類庫,如對Google Map的調用(見vclgoogle目錄),對PHPBB論壇的調用等。這下你明白了吧,為什麼D4P這麼強大,呵呵,因為它站在巨人的肩膀之上啊。不過這也帶來了一個問題,太依賴別人的類庫,缺乏自主性,對於代碼質量帶來了不可控因素。
對於第一個測試程序,很簡單,就是一個表單提交數據,然後返回響應。大家可以自己參照Demo來寫,我測試了一下效率,大概執行時間在0.5秒左右,嗯,算是非常慢。
對於第二個測試程序,也就是數據庫操作程序,是我比較重視的,下面來詳細介紹一下。
D4P目前支持MySQL和Interbase兩種數據庫。我打開D4P的安裝目錄看了一下,原來數據庫訪問層使用的是ADODB(http://adodb.sourceforge.Net/)這個開源類庫。也就是說理論上將來D4P可能支持非常多的數據庫,因為ADODB實在太強大(這裡是ADOdb支持的所有數據庫:http://PHPlens.com/adodb/supported.databases.Html)。
D4P提供了五種數據庫訪問控件(Data Access:Datasource,Database,Table,Query,StorProc—數據源、庫、表、查詢、存儲過程)和三種數據庫控制控件(DBGrid,DBPaninator,DBRepeater—表數據列表、分頁、表數據或記錄集列表)。
DBGrid的設計還是很精巧的,前端采用了AJax,顯示很漂亮,還可以直接更新。但顯示速度較慢。老實說這樣一種東西對於管理後台數據庫似乎中看不中用,如果是數據庫管理,我們還是使用熟悉的更為強大的PHPMyAdmin吧;如果是提供給用戶的管理頁面,我們要定制很多頁面效果,DBGrid又不滿足要求(太復雜了,而且都封裝起來了,修改效果不如自己寫)。用於給客戶作展示倒是挺適合的。
我們再來測試一下代碼的執行速度。任務很簡單,我們從兩個表中分別讀取30條記錄,然後分別兩個生成DataGrid:
測試代碼非常簡單:
<?PHP
$time_start=microtime_float();
//Includes
require_once("vcl/vcl.inc.PHP");
use_unit("forms.inc.PHP");
use_unit("dbgrids.inc.PHP");
use_unit("dbctrls.inc.PHP");
use_unit("db.inc.PHP");
use_unit("dbtables.inc.PHP");
use_unit("extctrls.inc.PHP");
use_unit("stdctrls.inc.PHP");
$time_start2=microtime_float();
//Classdefinition
classUnit2extendsPage
{
public$DBGrid2=null;
public$dsfeedentry1=null;
public$tbfeedentry1=null;
public$Query1=null;
public$DBGrid1=null;
public$dsarticle1=null;
public$dbhappycms21=null;
public$tbarticle1=null;
}
global$application;
global$Unit2;
//Createstheform
$Unit2=newUnit2($application);
//Readfromresourcefile
$Unit2->loadResource(__FILE__);
//Showstheform
$Unit2->show();
functionmicrotime_float(){
list($usec,$sec)=explode("",microtime());
return((float)$usec+(float)$sec);
}
$time_end=microtime_float();
$time_lib=$time_start2-$time_start;
$time_total=$time_end-$time_start;
echo"Loadedlibsin$time_libsecondsandallprocessedin $time_totalseconds";
?>
輸出結果:
Loaded libs in 1.1935691833496 seconds and all processed in 2.1492249965668 seconds
結果告訴我們:讀取兩個表並且生成DataGrid總共花費了2.14秒,其中加載公用類庫用了1.2秒。
我用PHP程序員最常用的數據表讀取及輸出結果的代碼進行同樣功能的代碼重寫,即用兩個MySQL_query(‘SELECT * FROM table limit 0,30’)得到結果並用while循環輸出,消耗時間為:
All processed in 0.31938099861145 seconds
0.3秒對2.1秒,相差7倍,可見D4P的DataGrid效率相當低。注意這是測試的是服務器端數據查詢的執行效率,實際上在浏覽器端的顯示也有明顯延遲,可能qooxdoo的效率也不高。
D4P除了有自帶的基於qooxdoo的DataGrid,還可以與PEAR的DataGrid直接集成,就是一個正常的Html表格界面,相對比較容易擴展。
其它:
小結一下:
D4P的優點:
界面清爽漂亮,IDE速度較快。操作簡便,繼承了Delphi的傳統。
控件相當齊全,所有的表單和常見的HTML控件,還有不少特色組件,比如Html在線編輯器、進度條、日期選擇器、日歷、樹狀菜單等等。還有數據庫和WEBServices控件等。可以滿足大部份情況下設計的需要。
代碼可復用性高。
D4P的缺點:
只支持Windows平台;光是這一點,就無法與ZDE相抗衡,不過在中國問題不大,因為在中國大部份人都在Windows下開發項目,在Linux下布署。
生成的代碼執行效率不高。
這是個主要缺陷,具體看上面的測試數據。如果是“展示型”的站點,例如門戶網站的新聞頻道,肯定不可能用這樣的框架來開發。因為我們要對服務器端的腳本和生成的Html/JavaScript都要精確控制,減少效率和帶寬上的浪費。
將來我也許會拿D4P來開發OA之類的企業內部應用。這種項目界面控件比較多,需求比較復雜,變化比較多,但系統負載不大,對效率要求不高。
VCL for PHP以大量開源類庫為基礎,代碼質量不能保證完全可控制。
Vcl for PHP無法對其使用的開源類庫的代碼作統一的質量控制,所以我對這樣一個工具執懷疑態度。我喜歡程序的每一部份都是“可控”的,過多的封裝和過多的依賴其它第三方類庫讓我對其內部產生不信任。
當然,Vcl for PHP作為開源項目才誕生一個月,還有很大發展空間,讓我們過段時間再來關注一下,也許到時會有驚喜出現。