身為 Web 開發人員,無論您偏好哪種技術組合,Eclipse 都是提升生產力的最佳整合開發環境 (IDE)。在「用 Eclipse Europa 進行 Web 開發」三部曲系列的第一部分,我們已探討如何利用 Eclipse 最新版本 Europa 快速開發 Java Web 應用程式。本文將深入介紹如何透過 PHP Development Toolkit (PDT) 這組 Eclipse 外掛,輕鬆開發 PHP 應用程式。
您是 PHP 開發人員嗎?如果是,您使用什麼開發環境?或許您堅持使用 vi 或 Emacs,或許想用 IDE 卻遲遲未能決定選擇哪款商業產品。無論採用何種方式,都有必要了解適用於 Eclipse 的 PHP Development Toolkit。Eclipse 早已不再只是 Java 開發人員的專屬工具。具備 PHP 程式設計背景對充分發揮本教學效果至關重要,熟悉 Eclipse IDE 雖有幫助但非必要。
在「用 Eclipse Europa 進行 Web 開發」系列中,您將發現無論選擇何種語言,Eclipse 都是 Web 開發的理想平台。靈活的外掛系統讓它能輕鬆創建針對 Java、PHP 和 Ruby 等語言量身打造的 Eclipse 版本。您將看到不同外掛如何為各語言提供獨特功能,以及所有 Web 開發人員都能受益的通用功能。本系列將以建立一個範例棒球 Web 應用程式為例,允許輸入球員比賽數據並計算統計資訊。
Eclipse 多年來深受 Java 開發人員喜愛,但其初衷是成為適合所有語言的開發平台。Eclipse 以 Java 編寫,自然以 Java 開發為起點,而其外掛架構吸引了大量強大外掛,這是 Eclipse 成功的關鍵。結合「適合所有語言的強大開發平台」與「外掛架構」兩大因素,PHP Development Toolkit (PDT) 應運而生。
本文是三部曲系列的第二部分。第一部分已展示使用 Eclipse IDE for Java EE Developers 開發 Java Web 應用程式的便利性。Java EE Edition 實際上是運行在 Eclipse Platform 上的外掛集合。本教學將示範如何使用 PDT 這組外掛開發 PHP 應用程式,並再次介紹 Java EE Edition 中也屬於 PDT 一部分的功能。
擁有 PHP 程式設計背景對發揮本教學最大效果至關重要。熟悉 Eclipse IDE 將十分有幫助,但並非必要。
您的電腦需安裝以下軟體或外掛:
PDT 於 2007 年 9 月成功推出 1.0 版,現在就讓我們開始使用 PDT,成為生產力更高的 PHP 開發人員。
PHP 的優勢之一是能用簡單工具完成許多工作。您可以直接在 Web 伺服器的「即時」目錄編寫程式碼,將瀏覽器指向頁面即可預覽。需要修改程式碼?只需用文字編輯器修改並重新整理瀏覽器。誰需要 IDE?
應用程式最初可能很簡單,但不可避免會變得越來越複雜。正如馬克士威的惡魔,熱力學第二定律(熵隨時間增加)同樣適用於軟體工程。對大多數開發人員而言,若有偵錯器能停止程式碼執行、深入探究、檢查應用程式狀態,開發這類系統會更容易。
複雜應用程式通常涉及多位開發人員同時開發,通常需要原始碼控制,最好將其整合到開發環境中。使用原始碼控制通常涉及將原始碼與執行環境 (通常是 Web 伺服器) 保持獨立,此時擁有能輕鬆將程式碼部署到 Web 伺服器的開發環境最為理想。
PHP 開發幾乎總是涉及資料庫。雖然可用命令列工具和文字工具操作資料庫,也可用圖形程式簡化操作,但將圖形環境整合到開發環境中才是真正的整合開發環境。PDT 無疑就是這樣的環境。
假設您已確信 IDE 能為 PHP 開發帶來好處。PDT 不是第一個也不是唯一的 PHP IDE,市面上有一些備受關注的商業 IDE。但 Eclipse PDT 免費且開源,建立在 Eclipse 基礎上,意味著能充分利用 Eclipse Platform 的優勢。它是跨平台的,可在 Windows、Mac OS X 或您選擇的 Linux 發行版中使用。大量 Eclipse 外掛同樣適用於 PDT,讓您能按需添加專門功能,甚至在其他語言中開發。
PDT 是 Eclipse Platform 的外掛集合,每個外掛提供旨在提高生產力的特定功能。核心 PHP 外掛提供語法高亮、語法提示和所有 PHP 核心函數的整合查找功能。它與 Web 伺服器整合,讓您輕鬆將程式碼部署到伺服器。您可以在內部 Web 瀏覽器中查看頁面,也可指定外部瀏覽器 (Firefox、Internet Explorer、Safari 等)。
如前所述,最有價值的優勢之一是整合偵錯器。可直接從 PDT (包含 PHP 可執行檔) 執行和偵錯 PHP 程式碼,也可將 Web 伺服器配置為使用啟用偵錯的 PHP 版本,偵錯在伺服器上即時運行的腳本。
同樣重要的是,您獲得了非 PHP 專屬的功能,歸功於 Eclipse 的可擴展性。這包括連接任何資料庫 (任何可用 JDBC 驅動程式的資料庫,幾乎涵蓋所有資料庫)、建立表格、查詢和更新資料的資料庫工具。PDT 內建 CVS 客戶端,若使用 Subversion 而非 CVS,可輕鬆獲取 Subversion 外掛。同樣,您可同時編寫 PHP、JavaScript 和 CSS;PDT 還提供幾個優秀的 JavaScript 和 CSS Eclipse 外掛可供選擇。既然已決定在下一個 PHP 專案中使用 PDT,讓我們看看如何安裝。
獲取並安裝 PDT 毫不費力。它不僅建立在 Eclipse 基礎上,像 Eclipse 一樣完全開源,無試用期限制,無授權憂慮,下載即用。安裝 PDT 有兩種方式,取決於是否已安裝 Eclipse。若您已完成本系列第一部分,則擁有 Eclipse Java EE Edition。首先看如何在 Eclipse 之上安裝 PDT。
首先將 PDT 作為 Eclipse 外掛安裝。Eclipse 的外掛架構使此操作簡單。安裝任何 Eclipse 外掛最簡單的方法是使用其更新系統。依序選擇 Help > Software Updates > Find and Install。

選擇 Search for new features to install。

將 PDT 的更新站點添加到 Eclipse 已知站點列表。點擊 New Remote Site 添加站點。

輸入 PDT 更新站點資訊。名稱可自訂 (如「PHP Development Toolkit Updates」),關鍵是 URL:https://download.eclipse.org/tools/pdt/updates。

新更新站點會顯示在列表中並自動勾選。確保它是唯一勾選項目,點擊 Finish。

Eclipse 將連線更新站點獲取可用更新列表。選擇 PHP Development Toolkit Updates 並點擊 Finish。

接受授權協議並點擊 Finish。

Eclipse 將下載並安裝 PDT 外掛。完成後可能要求重新啟動 Eclipse。重啟後,透過切換到 PHP 透視圖驗證安裝:選擇 Window > Open Perspective > Other。

從列表選擇 PHP 並點擊 OK。

PHP 透視圖隨即開啟,稍後我們將使用它。先快速了解 PDT 的另一種安裝方式。
若您剛開始使用 Eclipse,有更簡單的方法:下載 Eclipse 和 PDT 的完整發行版。選擇並下載 PDT All-In-One,解壓縮並啟動 Eclipse。啟動後選擇 Window > Open Perspective > PHP 切換到 PHP 透視圖。

PDT 現已安裝並可使用。接著配置 Eclipse PDT。
安裝 PDT 後,還有幾項配置能讓開發更順手。首先配置 Web 伺服器。
雖可將專案設置在 Web 伺服器根目錄下,但最好將原始碼與部署分離。需讓 PDT 知道 Web 伺服器位置,以便發布原始碼。開啟 Preferences。

在 Preferences 下展開 PHP 並選擇 PHP Servers。

通常已有一個未配置的預設伺服器。您可添加新伺服器或配置預設伺服器,會看到類似下圖對話框。

最重要的是設置 Web 伺服器路徑和對應 URL。完成後點擊 OK。從 Preferences > PHP 選擇 PHP Executables。

點擊 Add 開啟對話框。

設置標籤,關鍵是選擇 PHP 可執行檔所在目錄。若不知路徑,可用 Browse 按鈕查找。保留 PHP 偵錯器為預設值 Zend。點擊 OK 完成 Web 伺服器配置。還需配置 PDT 與資料庫通訊。
應用程式將使用 MySQL 資料庫。PDT 包含提供 PHP 專屬功能的外掛,也包含存取資料庫的外掛,但存取資料庫非 PHP 專屬,PDT 使用的 Eclipse 資料庫外掛也非 PDT 專屬。
若您完成第一部分,已使用過 PDT 附帶的資料庫外掛。若在 Java EE Edition 上安裝 PDT,已配置連接 MySQL。若未學習第一部分,請參閱該部分建立 baseball 資料庫。應能切換到 Database Development 透視圖 (Window > Open Perspective > Other > Database Development) 並用 Data Source Explorer 連接 baseball 資料庫。

現可查詢資料庫,準備好為第一部分開始的棒球應用程式編寫更多程式碼。
PDT 設置完成,開始開發。首先在 PDT 建立 PHP 專案,再建立 PHP 檔案,利用 PDT 功能輔助編寫程式碼,然後發布測試。
確保在 PHP 透視圖中 (Window > Open Perspective > PHP)。預設 PHP Explorer 視圖在左上角。在 PHP Explorer 右鍵選擇 New > PHP Project。

開啟 New PHP Project 精靈,只需設置專案名稱和程式碼位置。

點擊 Finish 建立專案。在 PHP Explorer 右鍵選擇 New > PHP File。

開啟 New PHP File 精靈,配置檔案路徑和名稱。

點擊 Finish,PDT 依模板建立基本骨架的 PHP 檔案。首先建立定義常數的檔案。
<?php
define('DB_HOST', "127.0.0.1:3306");
define('DB_USER', "root");
define('DB_PASSWORD', "password");
define('DB_NAME', "baseball");
?>
定義資料庫連線常數,請根據環境修改數值。PDT 優勢之一是追蹤專案結構,包括常數。預設 PHP Project Outline 視圖在左下角,展開 Constants 區段即可看到結構。

使用這些常數建立資料庫連線,供需存取資料庫的腳本引用。建立另一個 PHP 檔案 db.php,引入 constants 檔案,建立 MySQL 連線。若不熟悉語法,PDT 可協助。預設 PHP Function View 在左下角,查找 mysql_connect 函數。

不僅獲得 PHP 5 所有標準函數和類別列表,還能存取函數文件。選擇函數滑鼠懸停即可查看文件。找到所需函數雙擊,即插入游標處。輸入參數時上方顯示參數資訊協助追蹤。

mysql_connect 建立資料庫連線。編寫程式碼檢查連線是否存在,程式碼協助再次出現。

這種程式碼協助在專案和腳本變複雜時極其有用。db.php 其餘程式碼如下:
<?php
require_once(dirname(__FILE__)."/constants.php");
$conn = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$conn) {
echo "Unable to connect to DB: " . mysql_error();
exit;
}
if (!mysql_select_db(DB_NAME)) {
echo "Unable to select mydbname: " . mysql_error();
exit;
}
?>
此腳本可在多處重複使用。首先建立輸入新球員資訊的表單。
建立輸入新球員的基本表單。建立 new_player.php,從基本 HTML 開始。
<html>
<head>
<title>Player Entry Form</title>
</head>
<body>
<form id="entry" method="POST">
<input type="hidden" name="action" value="create"/>
<div id="fnSection">
<span id="firstNameLabel">First Name:</span>
<input type="text" name="firstName"/>
</div>
<div id="lnSection">
<span id="lastNameLabel">Last Name:</span>
<input type="text" name="lastName"/>
</div>
<div id="submitSection">
<input type="submit" value="Save"/>
</div>
</form>
</body>
</html>
PDT 提供優秀的 HTML 語法高亮。表單提交後需添加處理邏輯,使用 db.php 並再次利用 PDT 的 PHP Function 視圖編寫資料庫邏輯。完成腳本如下:
<?php
if ($_POST["action"]){
$label = "";
require_once(dirname(__FILE__)."/db.php");
$firstName = mysql_escape_string($_POST["firstName"]);
$lastName = mysql_escape_string($_POST["lastName"]);
$fullName = "$firstName $lastName";
$sql = "insert into Players(First_Name, Last_Name) values
('$firstName','$lastName')";
mysql_query($sql, $conn);
$id = mysql_insert_id($conn);
$label = " Insert successful for $fullName new ID=$id";
}
?>
<html>
<head>
<title>Player Entry Form</title>
</head>
<body>
<?=$label ?><br/>
<form id="entry" method="POST">
<input type="hidden" name="action" value="create"/>
<div id="fnSection">
<span id="firstNameLabel">First Name:</span>
<input type="text" name="firstName"/>
</div>
<div id="lnSection">
<span id="lastNameLabel">Last Name:</span>
<input type="text" name="lastName"/>
</div>
<div id="submitSection">
<input type="submit" value="Save"/>
</div>
</form>
</body>
</html>
現在有完整表單和腳本,接著測試。
用 PDT 部署到 Web 伺服器 (本例為 Apache) 很輕鬆。在 PHP Explorer 中右鍵點擊需測試的 PHP 頁面選擇 Run As > PHP Web Page。

開啟 Run PHP Web Page 對話框,顯示發布位置和開啟 URL,可按需調整。

預設 Eclipse 使用內部 Web 瀏覽器 (Windows 上 IE、Mac OS X 上 Safari 等)。您將看到如下頁面:

輸入新球員點擊 save,頁面重新整理。

快速測試效果良好。更複雜應用可能大量使用 CSS 和 JavaScript,查看網頁時可能需更複雜偵錯選項。配置使用的 Web 瀏覽器:點擊 Preferences > Web Browser。

重新啟動應用程式,將在所選瀏覽器中開啟。

目前已建立並部署簡單頁面。繼續探索 PDT 功能,建立稍微複雜的頁面。
建立所有球員列表,探索 PDT 協助完成此類任務的新方法。首先從資料庫讀取所有球員。
建立 list_players.php,引入 db.php 查詢資料庫。使用 mysql_fetch_assoc 將資料列取入 PHP 關聯陣列。假設不熟悉此函數,需比 PDT 基本文件更多幫助。右鍵點擊可存取 PHP 手冊。

預設開啟 PHP.net 線上手冊,可配置為本地副本。球員基本顯示程式碼如下:
<?php
require_once(dirname(__FILE__)."/db.php");
$message = "";
$cnt = 0;
$sql = "select * from Players";
$result = mysql_query($sql,$conn);
$list = array();
if (!$result) {
$message = "Could not successfully run query ($sql) from DB: " . mysql_error();
} else if (mysql_num_rows($result) == 0) {
$message = "No rows found, nothing to print so am exiting";
} else {
while ($record = mysql_fetch_assoc($result)){
$list[$cnt++] = $record;
}
}
mysql_free_result($result);
?>
<html>
<head>
<title>Player List</title>
</head>
<body>
<div id="title">Player List</div>
<div id="pTableBox">
<table border="2">
<thead>
<tr>
<td>ID</td>
<td>First Name</td>
<td>Last Name</td>
</tr>
</thead>
<tbody>
<?php foreach($list as $player): ?>
<tr>
<td><?= $player["Id"] ?></td>
<td><?= $player["First_Name"] ?></td>
<td><?= $player["Last_Name"] ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
此程式碼顯示資料,但假設需添加排序功能。
排序可在資料庫完成,但為演示在 PHP 中完成。使用關聯陣列排序。
<?php
function assoc_sort($array, $id="Id", $sort_ascending=true, $is_object_array = false) {
$temp_array = array();
while(count($array)>0) {
$lowest_id = 0;
$index=0;
foreach ($array as $item) {
if (isset($item[$id])) {
if ($array[$lowest_id][$id]) {
if ($item[$id]<$array[$lowest_id][$id]) {
$lowest_id = $index;
}
}
}
$index++;
}
$temp_array[] = $array[$lowest_id];
$array = array_merge(array_slice($array, 0,$lowest_id),
array_slice($array, $lowest_id+1));
}
if ($sort_ascending) {
return $temp_array;
} else {
return array_reverse($temp_array);
}
}
?>
添加選擇排序方式和觸發功能的 JavaScript。
<?php
require_once(dirname(__FILE__)."/db.php");
$message = "";
$cnt = 0;
$sql = "select * from Players";
$result = mysql_query($sql,$conn);
$list = array();
if (!$result) {
$message = "Could not successfully run query ($sql) from DB: " . mysql_error();
} else if (mysql_num_rows($result) == 0) {
$message = "No rows found, nothing to print so am exiting";
} else {
while ($record = mysql_fetch_assoc($result)){
$list[$cnt++] = $record;
}
}
mysql_free_result($result);
$sort = $_GET["sort"];
if ($sort){
// sort the data
require_once(dirname(__FILE__)."/sort.php");
$list = assoc_sort($list, $sort, true, false);
}
?>
<html>
<head>
<title>Player List</title>
<script type="text/javascript">
function doSort(){
document.getElementById("sortForm").submit();
}
</script>
</head>
<body>
<div id="title">Player List</div>
<div id="sort">
<form id="sortForm" method="GET">
<span id="sortLabel">Sort by:
<select name="sort" onchange="doSort()">
<option value="Id"> </option>
<option value="First_Name">First Name</option>
<option value="Last_Name">Last Name</option>
</select>
</span>
</form>
</div>
<div id="pTableBox">
<table border="2">
<thead>
<tr>
<td>ID</td>
<td>First Name</td>
<td>Last Name</td>
</tr>
</thead>
<tbody>
<?php foreach($list as $player): ?>
<tr>
<td><?= $player["Id"] ?></td>
<td><?= $player["First_Name"] ?></td>
<td><?= $player["Last_Name"] ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
建立更複雜表單,可能有更複雜錯誤,是引入偵錯器的好時機。
使用 PHP 偵錯,必須將 Web 伺服器設置為提供偵錯符號並允許偵錯器連線、獲取偵錯資訊、控制執行流程。還需能連接伺服器的客戶端。PDT 就是這樣的客戶端,支援的偵錯器之一是 Zend Debugger。Zend 是 PHP 主要貢獻者也是 PDT 主要貢獻者。
為 PDT 安裝 Zend Debugger,可用 Eclipse 軟體更新功能,過程如安裝 PDT 外掛。唯一差別是更新站點為 https://downloads.zend.com/pdt。
在伺服器安裝 Zend Debugger 需幾個步驟:下載、加入 PHP 擴充目錄、配置 php.ini 啟用擴充 (並停用不相容擴充)。附帶 dummy.php 腳本提供實際偵錯資訊給客戶端。一切就緒後,可在 PDT 中偵錯。
在 PDT 設置斷點:在程式碼選擇一行,右鍵選擇 Toggle Breakpoints。

開始偵錯:在 PHP Explorer 腳本右鍵選擇 Debug As > PHP Web Page。

系統提示切換到 PHP 偵錯透視圖。執行後看到偵錯視圖。

現可深入程式碼檢查變數。

若使用 Eclipse 進行 Java 開發,這一切看起來非常相似。它是 Java 開發使用的同一組偵錯工具,能大幅提升生產力。
Eclipse 可提供 Web 開發所需一切,整合資料庫、Web 伺服器及所需工具。提供建立專案和 PHP 檔案的精靈、語法高亮、程式碼協助、程式碼和專案圖形結構視圖、函數列表、快速存取文件。輕鬆發布和運行程式碼。最後,將 Eclipse 強大偵錯器引入 PHP 世界。
第三部分將繼續利用 Europa 進行 Web 開發,使用 Ruby Development Tools (RDT) 和 RadRails 外掛進一步擴展棒球應用程式。