入門級 PHP Web 應用程式開發/我們的第一個程式:Hello,World!
“Hello,World!”通常是任何學習一門新語言的學生學習的第一個程式。恰好,由於我們在這本書中涵蓋了多種語言和方法,您將看到針對每個解決問題的方法的不同版本的“Hello,World!”。並非本書中的所有示例都將從所有可能的不同方法中呈現出來。但是,重要的是要意識到,無論何時您進行 Web 應用程式開發,總有不同的方法可以解決一個問題。
編寫“Hello,World!”的第一種方式是作為靜態 HTML 4.01 頁面。HTML 本身將構成您將編寫的幾乎所有 Web 應用程式的基礎,因此絕對不要低估正確 HTML 的重要性。

這將在您的瀏覽器視窗中簡單地顯示“Hello,World!”,頁面標題為“Hello,World!”。
上面 HTML 文件中的第一行是 DOCTYPE——文件型別。文件型別告訴 Web 瀏覽器如何解釋隨後的文件。今天編寫的 Web 應用程式有幾種有效的文件型別。重要的是您為應用程式選擇正確的型別,然後堅持使用它。
上面的文件型別告訴瀏覽器使用 HTML 4.01 Strict——這是我們將在整本書中使用的文件型別。還有其他文件型別可供使用
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
這是 HTML 4.01 Strict。如果您以前使用過 HTML,例如 HTML 3.2 或 HTML 4 Transitional,這可能是最難適應的。如果您是 HTML 新手,這是您學習開始的最佳選擇。無論哪種方式,未來的 HTML 版本(稱為 XHTML)都將最像 HTML 4.01 Strict,並且建議用於非 XHTML 文件。
我們在本書中使用 HTML 4.01 Strict,因為截至目前(2006 年 6 月),XHTML 1.1 仍然不受 Microsoft Internet Explorer 支援,而 Microsoft Internet Explorer 在瀏覽器市場上佔有相當大的份額(如果不是大多數的話)。一旦 Microsoft Internet Explorer 包含對 XHTML 1.1 標準的支援,使用 XHTML 1.1 作為新網頁和應用程式的預設文件型別將是明智的(合乎邏輯的)。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
這是 HTML 4.01 Transitional,它允許用 HTML 4 編寫“舊式”HTML。最值得注意的是,HTML 4.01 Transitional 在 HTML 4.01 Strict 標準中添加了表示性和已棄用的元素。建議那些需要使用包含的元素的使用者使用它。在 網際網路上有一個已棄用的元素列表。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
這是用於框架集頁面的。HTML 允許框架集頁面,這些頁面在瀏覽器視窗中定義框架,然後將內容載入到這些框架中。在頁面上使用框架通常存在爭議,通常不鼓勵使用。但是,與所有規則一樣,也有例外。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
這些是 XHTML 文件型別。XHTML 是 HTML 的 XML 化版本。它比 HTML 更好,但是,仍然缺乏 Microsoft Internet Explorer 的完全支援(截至 2006 年 6 月),這使得它目前在受控環境之外不可行[1]。
網際網路上提供的每個文件都包含一個“Content-Type”標頭。對於基於 HTML 的 Web 應用程式,必須傳遞的正確 Content-Type 標頭是
Content-Type: text/html
還建議您指定應用程式使用的字元集。 UTF-8 是一個常見的選擇[2],因為它包含大多數人在多種語言中使用的字元。對於使用 UTF-8 的應用程式,正確的 Content-Type 標頭是
Content-Type text/html; charset=utf-8
有一些基本規則可以遵循,以確保您始終編寫正確的 HTML
- 如果某個元素有結束標籤,請使用它。
- 不要製作標籤湯——也就是說,不要用 <p> 開始一個段落,然後用 <p> 開始一個新段落,而沒有結束第一個段落。
- 使用 HTML 4.01 或任何版本的 XHTML 時,使用小寫 HTML 標籤。早於 4.0 的 HTML 版本使用大寫標籤,並且已棄用。
- 避免內聯 style 屬性。如果可能,使用類和 id 屬性以及級聯樣式表來呈現效果。(有時,必須使用內聯樣式資訊;但是,這種行為在技術上已棄用——內容和表示不應該以這種方式混合在一起。)
- 不要在 HTML 4.x 文件中使用 XHTML 樣式的空標籤。一些瀏覽器(例如 Microsoft Internet Explorer)在 HTML 4.x 文件中遇到這些標籤時會卡住,並且不知道如何解析它們。結果可能不可預測。
- 使用 W3C 驗證服務 來驗證您的工作。如果您正在進行一個內部網路而不是公共網際網路的專案,仍然使用該服務驗證您的工作,儘管您需要貼上標記進行驗證。
- 一些大型公司(例如 AT&T)可能擁有自己內部的文件驗證器副本。如果您可以使用此類驗證器,請使用它——它允許您驗證無法在開放網際網路上傳輸的機密內容。
- 如有必要,以某種方式將 W3C 驗證服務映象到本地。
這本質上是一個小型程式,它指示 Web 瀏覽器顯示資訊,並具有對使用者有用的標題。它包含有效 HTML 4.01 Strict 的所有正確元素,這意味著它應該在任何支援 HTML 4.01 Strict 的 Web 瀏覽器中正確呈現。這是可以使用的最小文件,並且不包含任何樣式資訊(我們將在後面學習)。
在這個例子中,您已經瞭解了文件型別(對於有效的 HTML 文件是必需的),使用字元集設定 Content-Type 標頭(這對於確保正確顯示非常重要,尤其是如果它包含非 ASCII 字元,例如 ß、¥、¶、© 或 ®),並且您看到了 HTML 文件的基本結構。隨著我們繼續學習,我們將以此為基礎,包括以下三個示例。
在前面的示例中,您看到了 HTML 4.01 如何憑藉常規的靜態內容獨立存在。這意味著當一個 HTML 文件被儲存到 Web 伺服器上時,就像上面的那個,它不會在沒有人工干預的情況下改變。有人必須編輯並儲存檔案,然後再次上傳到伺服器,才能讓其他人看到更改[3]。

在這個例子中,您可以看到檔案的一部分發生了變化。我們使用了一個新的副檔名 - .php 儲存了檔案,這告訴伺服器它必須在伺服器上進行處理。此外,檔案中還有一些新專案。我們將看一下在這個程式中發現的元件。
“開啟”和“關閉”PHP
[edit | edit source]PHP 檔案在計算機世界中有點奇怪——實際上,檔案通常只有一部分是 PHP。檔案的其餘部分是輸出語言是什麼;在本例中,它將是 HTML 4.01 Strict。為了使這成為可能,應用程式編寫者必須有一種方法來告訴 PHP 在哪裡開始和停止查詢 PHP 程式碼。
為此,我們使用 PHP 開啟標籤 (<?php) 來告訴 PHP 開始讀取指令,並使用 PHP 關閉標籤 (?>) 來告訴 PHP 停止讀取指令[4]。開始和結束標籤之間的所有內容都由 PHP 讀取並執行。標籤之外的所有內容都將被無障礙地傳遞。在第 1 行,您看到了第一個 PHP 開啟標籤,而在第 11 行,您看到了第一個關閉標籤。它們之間的所有內容都由 PHP 執行。
PHP 中的註釋
[edit | edit source]您在上面的 Hello, World 程式中遇到的下一件事是註釋。PHP 中通常使用兩種型別的註釋。我們遇到的第一個註釋是多行註釋,它從第 2 行開始,到第 5 行結束。此註釋以/*開頭,以*/結束。這些型別的註釋借鑑了 C 計算機語言。
多行註釋適合於跨越多行的備註。在上面的示例中,我們使用多行註釋進行演示。它通常在檔案的標題中很有用,可以簡要概述檔案的作用。有些人使用標題來提供有關版權、許可證資訊和其他與檔案相關的元資料的資訊。隨著時間的推移,您將開發自己的程式碼編寫風格,包括在專案中構建檔案的方式。
用於管理資料庫連線的檔案的元資料的標題示例可能如下所示
<?php /* * Database Library for MySQL * Copyright © 2006 Michael B. Trausch, <email@invalid.com> * Released under the terms of the GNU General Public License v3 */
我們看到的第二個註釋,緊隨第一個註釋之後,是單行註釋。此註釋以//字元開頭,在行尾結束。這些型別的註釋適合於簡要描述接下來的幾行程式碼,或進行某項操作的原因。
關於註釋,最重要的是,如果它們是多餘的,它們就不會包含在語言中。重要的是要了解,缺乏註釋的程式碼以及註釋過多的程式碼都可能變得難以閱讀和理解,無論是其他人還是以後的自己。許多程式設計師在編寫程式碼時理解自己的程式碼,但是,當他們在六個月後返回時,卻不知道自己為什麼那樣編寫程式碼。瞭解何時註釋以及何時不註釋很重要。隨著時間的推移,您將學會何時在程式碼中放置註釋合適。
PHP 函式
[edit | edit source]PHP 有一個龐大的函式庫,您可以使用這些函式來幫助您的程式碼真正執行操作。在上面的示例中,PHP header() 函式用於向 Web 瀏覽器傳送HTTP 頭[5]。這相當於(有時,對於舊版瀏覽器,效果更好)第一個示例中使用的 HTML <meta> 標籤。
PHP 有大量您作為程式設計師可以呼叫的函式。幸運的是,PHP 手冊 是一款非常易於使用的資源,它對可用函式進行分類,並允許您搜尋它們。作為 PHP 應用程式開發人員,PHP 手冊可能是您擁有的最重要的資源之一。在閱讀本書的過程中,您會發現更多我們將使用的 PHP 函式。
PHP 變數
[edit | edit source]Web 應用程式程式設計,尤其是 PHP 的一大難題是,您希望內容是動態的——您不希望使用永遠不會更改的靜態頁面集。變數是動態頁面的基石。如果 PHP 沒有任何型別的變數,那麼利用該語言的其他功能來幫助處理、儲存和檢索資料將極其困難。
變數可能是 PHP 中使用最廣泛的專案,也可以說是任何程式設計或指令碼語言中最廣泛使用的專案。確保您理解它們是什麼以及它們是如何使用的非常重要。變數是資料的容器,簡單來說。它們中的每一個都有一個名稱。在我們上面的 Hello, World 指令碼示例中,我們建立的第一個變數是
$hello_text = 'Hello, World!';
我們在這行程式碼中所做的就是將文字“Hello, World!”分配給我們稱之為$hello_text的變數。現在,可以隨時更改此變數。我們可以讓$hello_text變數儲存文字“Hello, Betsy!”,甚至儲存數字 42!
我們將在本書的後面更多地瞭解變數。現在,重要的是要意識到,當您分配變數時,變數的名稱必須在左側,而它的新內容必須在右側。它們之間有一個等號。
我們還需要立即瞭解的一件事是,PHP 程式碼中有兩種型別的文字字串。您可能會注意到,在第 9 行,我們使用單引號,而在第 10 行,我們使用雙引號。它們之間存在差異。單引號字元 (') 指定一個絕對文字字串。單引號標記之間的任何內容都將完全按其出現的方式儲存。
但是,雙引號有點不同。使用雙引號字串可以執行一些巧妙的技巧。我們在第 10 行看到了其中一個技巧:我們將一個變數的內容包含在另一個變數中。這稱為變數插值,是某些型別語言中的常見做法。這是 PHP 的一項功能,您將在程式中經常使用它,並且您將在其他程式設計師的程式碼中經常看到它。看一下第 10 行
$page_title = "$hello_text (PHP Version)";
我們可以看到那裡有一個雙引號。由於我們知道(在這種情況下)$hello_text包含什麼,我們可以看一下這行程式碼,並“看到”PHP 從中獲得了什麼
$page_title = 'Hello, World! (PHP Version)';
PHP 將對$hello_text的引用替換為$hello_text在當時的內容。我們將在本書的後面更詳細地討論這一點。
關於變數:camelCase 或下劃線?
[edit | edit source]編碼風格因專案而異,也因人而異。編碼風格中一個主要問題是如何命名變數。您已經看到,我們選擇使用下劃線——例如,$hello_text——而不是“camelCasing”(例如,$helloText)。這樣做的原因是經驗;作者發現,使用 camelCasing 往往會在許多程式語言中創造出很容易錯誤地鍵入變數名稱的情況,這會導致難以除錯和修復的問題。一個例子是,如果$helloText意外地被鍵入為$hellotext或$helloTExt——當<SHIFT>鍵難以按下或卡住時很常見——並且在快速瀏覽程式碼以檢視問題所在時不容易發現。
由於 PHP 的工作方式,如果避免使用 camelCasing,更容易建立正確的程式碼。最初可能需要一段時間才能習慣使用下劃線來分隔變數名稱中的單詞,但這是一種確保命名方式一致的非常有用的方法。但是請記住,如果您使用他人的程式碼——比如別人的類庫——您可能會發現他們選擇使用 camelCasing,而至少使用一點點 camelCasing 是不可避免的。
無論你使用哪種編碼風格,如果你正在使用 PHP 建立一個新的 Web 應用程式,最好在專案中包含一個檔案來描述編碼風格,以便作為參考,並保持一致。
還有其他幾種方法可以編寫 Hello, World 程式,展示與瀏覽器和使用者互動的其他方式。但是,現在我們將忽略它們:它們使用了另一種叫做“JavaScript”的語言——JavaScript 真的值得單獨一節。請記住,這是入門材料,所以我們不會深入探討這裡會遇到的許多語言、主題和概念。[6]
回答以下問題。在思考並回顧答案後,將答案寫下來(或打出來)可以幫助你更好地記住資訊以便將來使用。在回答完問題後,將你的答案與書中的答案進行比較。
- 什麼是變數,使用它的目的是什麼?答案
- 單引號字串的目的是什麼?答案
- 雙引號字串的目的是什麼?答案
- 用 PHP 重新編寫 Hello, World 程式,使用另一個名為 $user_name 的變數。將你的姓名儲存在該變數中,並使程式顯示“Hello yourname,歡迎來到這個世界!”答案
我們已經介紹了很多資訊。鼓勵你進行一些練習,幫助你使用本頁中介紹的一些想法。
- 檢視網際網路上提供的 W3 HTML 驗證程式。在 Web 瀏覽器中檢視你的示例,並將瀏覽器“檢視原始碼”選項的輸出貼上到驗證服務中。請記住這個工具——它在未來對你很重要!
- 檢視 PHP 手冊,瞭解如何使用它。這是你在開發中經常使用的重要資源。
- ^ XHTML 1.0 Transitional 可以與 text/html Content-Type 標頭一起使用,但是,對如何使用它有限制。有關 XHTML 的更多資訊,請參閱 XHTML 附錄。
- ^ UTF-8 是一種八位字元集,用於在計算機系統之間表示 Unicode 字元。Unicode 在許多作業系統安裝中用作標準,並且能夠表示整個 Unicode 字元集標準。有關 UTF-8 的更多資訊,請參閱 維基百科上的資訊。
- ^ 有時,新的更改不會立即被以前檢視過該文件的 Web 瀏覽器獲取。第 2 節中使用的示例可能會更改為“Hello, User!”,但它可能不會立即被獲取。我們將在本書的後面看到如何解決這個問題,因為它是在所有 Web 應用程式中都要解決的問題。
- ^ 還有一個簡短的 PHP 開啟標籤 (<? ... ?>)。但是,它不能保證在所有系統上都啟用。此外,如果啟用,它可能會干擾 XHTML 文件。(XHTML Proper 必須以 <?xml...?> 開頭,PHP 將 <? 視為簡短的開始標籤。)有關更多資訊,請參閱 XHTML 附錄。
- ^ PHP header 函式用於向 Web 瀏覽器傳送任何 HTTP 標頭。此函式必須在程式中的任何其他輸出之前使用。它是一個非常流行的函式,我們將在本書的後面看到更多關於它的內容。
- ^ JavaScript 是一個稍微複雜一點的主題,因為它在客戶端(在使用者的 Web 瀏覽器中)執行。但是,你可以在不使用 JavaScript 的情況下編寫完美的 Web 應用程式。我們將在後面介紹 JavaScript,在我們掌握 PHP 和 HTML 程式設計中的不同程式設計概念之後,因為許多概念將會延續。