PHP通常是做為服務器端腳本執行,如果告訴你PHP可以編寫普通的GUI程序,你應該很感興趣.下面介紹的PHP-GTK就是PHP的GUI擴展.GTK是一個業界標准的圖形庫,具有良好的移植性.如果你用過linux的gnome桌面環境,對它應該不會陌生,Gnome就是在KDE遇到Qt許可證障礙後發展的自由軟件,GTK則是其采用的圖形庫。
PHP-GTK采用的是組件思想(可見組件思想幾十年前就有了),為此不能不提到tcl/tk語言。
Tcl/Tk 的發明人 John Ousterhout 教授在八十年代初,是伯克利大學的教授。在其教學過程中,他發現在集成電路 CAD 設計中,很多時間是花在編程建立測試環境上。並且,環境一旦發生了變化,就要重新修改代碼以適應。這種費力而又低效的方法,迫使 Ousterhout 教授力圖尋找一種新的編程語言,它即要有好的代碼可重用性,又要簡單易學,這樣就促成了Tcl (Tool Command Language) 語言的產生。TCL經常被用於 快速原型開發,腳本編程,GUI和測試等方面。
Tcl 最初的構想的是希望把編程按照基於組件的方法 (Component Approach),即與其為單個的應用程序編寫成百上千行的程序代碼,不如尋找一個種方法將程序分割成一個個小的, 具備一定“完整”功能的,可重復使用的組件。這些小的組件小到可以基本滿足一些獨立的應用程序的需求,其它部分可由這些小的組件功能基礎上生成。不同的組件有不同的功能,用於不同的目的。並可為其它的應用程序所利用。當然, 這種語言還要有良好的擴展性, 以便用戶為其增添新的功能模塊。最後,需要用一種強的,靈活的“膠水”把這些組件“粘”合在一起, 使各個組件之間可互相“通信”,協同工作。程序設計有如拼圖游戲一樣,這種設計思想與後來的 Java 不謀而合。終於在1988 年的春天, 這種強大靈活的膠水 - Tcl 語言被發明出來了。
按照 Ousterhout 教授的定義,Tcl 是一種可嵌入的命令腳本化語言 (Command Script Language)。“可嵌入”是指把很多應用有效,無縫地集成在一起。
說起來也很類似於現在炒做的很熱鬧的.NET,.NET有一個IL,中間語言,你可以用合適的語言做組件,通過IL實現模塊的銜接和重用。說白了,微軟這個思想就是借鑒了十幾年前的tcl/tk,只不過微軟有錢可以做得更好而已。
這種結構的先進性不言而喻,有好的代碼可重用性,簡單易學,有良好的擴展性,可重用,執行效率比單純的腳本高,功能也更強,解釋語言,代碼能夠動態的改變,平台無關。Win32, UNIX, Mac 上都可以跑,代碼緊湊,易於維護調試簡單等等。這種方式為後來很多腳本語言采用,如python,perl 等,php腳本的天性也非常適合做這種擴展,php-gtk只是其擴展的一種。
PHP-GTK創始人Andrei Zmievski 回憶了 PHP-GTK 計劃和創建的過程:
“我總是對 GUI 編程有著濃厚的興趣。我發現 Gtk+ 是一個非常好的工具包。目睹了 PyGtk 和 GTK-Perl 的實現,我決定嘗試 PHP 是否也能夠被做成 Gtk+ 的接口。2000年8月,我有了更多的業余時間,於是我開始試驗。我參考了 PyGtk 的實現方法,因為它有著相當完全的實現和漂亮的面向對象的接口。James Henstridge,PyG 的作者,在最初的籌備階段提供了極大的幫助。
“手工寫 Gtk+ 函數全部的接口幾乎是不可能的事情,所以我把重點放在了代碼生成上,就像 PyGtk 做的一樣。代碼生成器是一個PHP 程序,它可以讀取包含 Gtk+ 類、常量和方法信息的一系列的 .defs 文件並生成與 PHP 相接口的 C 代碼。無法自動生成的部分可以提交到 .overrides 文件。
“代碼生成器和基礎結構的工作花了我一定的時間,因為我在 2000 年秋天這段時間裡只能花很少的時間在 PHP-GTK 上。在我把 PHP-GTK 給 Frank Kromann 演示過後,他產生了濃厚的興趣,並開始幫助我完成代碼生成器和 Win32 的實現。當我們寫了第一個 Hello World 程序並設法使之工作之時,我們的喜悅之情溢於言表。兩個多月後,這個工程初見成效,並於 2001 年 3 月 1 日發布了內部版本。
“感到 PHP-GTK 前景廣闊,我便為它專門設置了郵件列表和 CVS 知識庫。同時,gtk.php.net 網站也建立起來。”
一個簡單的實例,更多的看安裝包裡面的 Demos。php-gtk 官方站點為 http://gtk.php.net,有在線手冊供查詢。目前 php-gtk 最高版本是 PHP-GTK2,還在進一步完善中。
可以從 http://gtk.php.net/download.php 下載一個完整的運行和測試軟件包,在命令行下運行:
php demosxxx.php
就可以測試裡邊帶的演示程序。
相信第一次看到演示的人一定會大吃一驚:原來 PHP 真能開發 Win32 的 GUI 桌面程序呀!
以下是一個示例,保存成名為 mydemo.php 文件到 demos 文件夾中,運行命令:
C:phpgtk2>php demosmydemo.php
就會彈出一個小窗口,可以用鼠標拖拽改變它的大小,點擊上面的按鈕,窗口就關閉,然後在 DOS 窗口裡輸出“Hello World!”字符串。
<?php
function destroy()
{
Gtk::main_quit();
}
function hello()
{
global $window;
print "Hello World!
";
$window-> destroy();
}
//建立一個GtkWindow
$window = &new GtkWindow();
//將 "destroy " signal用connect() 方法連接到shutdown函式
$window->connect("destroy", "destroy");
//建立一個GtkButton,按鈕文字為 "按我 "
$button = &new GtkButton( "Click Me ");
$button-> connect("clicked", "hello");
//把GtkButton放到是container的GtkWindow中
$window-> add($button);
//顯示$window以及它的所有child widget
$window-> show_all();
//進入程式主回圈(即程式啟動之意)
gtk::main();
?>
網眼測試感言:
PHP 能做到這一步著實讓人很感慨!但感慨之後,又覺得怪怪的。
首先是 PHP 在 Web 開發上的大行其道,遮掩了其桌面開發方面的光亮--還算不上光輝。而 PHP 在 Web 開發特別是網站開發方面,雖然早已經是業界老大,但其名分則一直是老三、老四的位置。這時,再談桌面開發,則覺得是“不務正業”了。
事實是,PHP-GTK 這個 PHP 分支是發展非常緩慢的,截至2010年8月份,其最近一次更新已經是2年半以前了。要麼是資金困擾、要麼是人力困擾、要麼是看不到商業前景,總之這個項目隨時都要胎死腹中的樣子,好像一陣微風都能吹滅它。
桌面開發,流行的是 VC++、Delphi、Winform(C#/VB.NET)、再勉強算上Java,好像根本沒 PHP 什麼事。本人覺得,既然借用的是 Linux 下的 GTK 庫,去 Linux 下發展豈不是更好,為何非要往 Windows 這扇窗戶裡鑽呢?PHP、Python的語法都有點怪異,不知道習慣了 VC++ 的人喜歡不喜歡?要說個人喜好,我還是最喜歡 C#,它吸收了 C/C++、JAVA等語言的優點,語法純正、符合習慣,能同時開發 Webform 和 Winform 程序,應該是前途無量的。