伺服器執行 PHP、處理數據及規則;瀏覽器渲染回傳 HTML。直接開啟 .php 不會經過這個流程。
1PHP 是甚麼
重點
- PHP 是常用的伺服器端手稿程式語言,可用於產生動態網頁、處理表單及存取數據庫。
- 基本流程:伺服器端執行 → 產生 HTML → 回傳瀏覽器;瀏覽器不會直接執行 PHP 代碼。
- 瀏覽器收到的是「執行後的結果」(通常是 HTML),一般看不到原本的 PHP 代碼。
- 因此,若只用檔案總管直接開啟
.php檔,PHP 不會被執行,頁面亦不會得到預期輸出。
PHP 是一種用於網頁開發的伺服器端手稿程式語言。典型用途是:根據資料(例如數據庫資料、用戶輸入、登入狀態)動態產生 HTML,再回傳給瀏覽器顯示。
- 瀏覽器請求:用戶在瀏覽器輸入網址,向伺服器發出請求。
- 伺服器執行 PHP:伺服器讀取檔案,遇到
<?php ... ?>便執行程式。 - 產生輸出:PHP 透過輸出語句(例如
echo/print)把內容寫入回應,通常是 HTML 片段。 - 回傳結果:伺服器把「執行後的 HTML」回傳;瀏覽器再把 HTML 渲染為畫面。
這個流程解釋了兩件事:第一,PHP 檔案必須在伺服器環境下執行;第二,敏感邏輯(例如驗證密碼)通常應放在伺服器端。
瀏覽器最終只會看到輸出的 HTML(例如 <p>你好,Ada!</p>),而不會看到 PHP 代碼。
- 伺服器端:可存取數據庫與權限資料,適合處理敏感邏輯;缺點是每次互動需要與伺服器通訊。
- 客戶端:在瀏覽器內執行(例如 JavaScript),互動快;但不可完全信任其輸入結果,因此仍需伺服器端覆核。
- 以為瀏覽器可以直接執行 PHP:實際上 PHP 必須由伺服器端執行。
- 把機密資料或驗證邏輯放在客戶端:可能被查看或繞過。
- 把 PHP 檔案當作純 HTML 開啟:會看不到 PHP 的執行結果。
用途與學習原因:為何需要伺服器端程式
若只使用超文本標示語言(HTML)及 CSS,頁面內容大多是固定的:不同用戶看到的內容差異不大。PHP 的價值在於「按情況產生內容」:例如根據數據庫讀取資料列出名單、根據用戶輸入顯示搜尋結果、根據登入狀態顯示不同功能等。
當你在瀏覽器輸入網址,實際上是向伺服器提出請求;伺服器收到請求後,會先執行 PHP,然後把輸出的 HTML 回傳。這表示:PHP 的執行環境不在瀏覽器,而在伺服器,因此更適合處理敏感資料與系統規則。
學習時,你可把 PHP 視為「會輸出 HTML 的程式」。只要掌握輸出、條件與循環,你已能產生大量結構化內容(例如清單、表格),為之後處理表單及數據庫建立基礎。
即時示範(模擬器)
示範:PHP 先執行,再回傳 HTML
請嘗試修改 echo 的內容,觀察輸出結果的變化。
Check Point 1:PHP 與伺服器端執行流程(≥40 題)
以概念理解題為主:伺服器端、輸出結果是甚麼、為何不能直接開啟 php 檔等。
2輸出語句與跳脫字符
重點
- PHP 語句一般以分號
;結束;代碼一般寫在<?php與?>之間。 echo與print都可輸出內容:入門階段可先以echo為主。- 字串可用單引號或雙引號:雙引號支援變量內插及常用跳脫序列。
- 跳脫字符(反斜線
\)用於輸出特殊符號,例如\n、\"、\\;常見錯誤是引號不配對或忘記跳脫。
echo:常用輸出語句,可輸出一段或多段內容,語法簡潔。print:同樣可輸出內容,但會回傳 1,因此可在較複雜的運算式中使用(入門階段毋須刻意使用)。
本章示例主要使用 echo,以降低語法負擔。
- 單引號:通常不處理跳脫序列(除非
\'與\\),亦不內插變量。 - 雙引號:支援常用跳脫序列與簡單變量內插,較適合輸出含變量的訊息。
\":在雙引號字串內輸出雙引號\\:輸出反斜線(例如路徑)\n:換行字符(注意:在 HTML 中通常需用<br>或nl2br()才能顯示換行)
- 忘記為字串內的雙引號跳脫,導致語法錯誤。
- 把反斜線路徑直接寫在字串內,忘記
\\。 - 誤以為
\n在 HTML 會自動換行。
字串與跳脫字符:寫對引號,才會輸出對內容
echo 與 print 的核心工作,是把內容輸出到回應之中。由於瀏覽器會把回應內容當作 HTML 解讀,所以最常見的做法是讓 PHP 輸出 HTML 片段,例如段落、清單或表格。
字串與跳脫字符是初學者最容易出錯的位置。你可先記住:若字串用雙引號包起來,字串內要輸出雙引號時,必須寫成 \";要輸出反斜線,必須寫成 \\。這些規則確保程式能分清楚「語法」與「字串內容」。
即時示範(模擬器)
示範:跳脫字符(\"、\\)
Check Point 2:輸出預測與跳脫字符(≥40 題)
以輸出預測題、跳脫字符辨識題為主。
3運算符與字串連接
重點
- 常用算術運算符:
+-*/%。 - 遞增/遞減:
++、--;組合指定運算符:+=、-=、.=等。 - 字串連接運算符是
.;.=會把串接結果寫回原本變量(重點)。 - 做輸出題時,建議先做「空運行」:逐行追蹤變量如何被更新,再判斷最後輸出。
變量用於儲存資料(以 $ 開頭,例如 $score)。運算符用於進行計算或組合資料,例如算術運算、字串連接等。
.:把兩段字串連接成新字串(不會自動更新原本變量)。.=:把右邊字串接到左邊變量後面,並把結果寫回該變量。
- 把字串連接誤寫成
+:PHP 應使用.。 - 忽略運算優先次序:輸出時建議加括號,例如
"Total: " . ($price*$qty)。 - 前置/後置遞增混淆:
$x++與++$x在輸出預測題常有不同結果。
運算優先次序與括號:令輸出更清晰
運算符是程式的「基本積木」。你可先以「讀取 → 計算 → 輸出」的思路學習:把資料存到變量,再用運算式計算,最後用輸出語句把結果呈現。當你把運算式放入輸出語句時,建議加上括號,令運算次序一目了然。
字串連接與輸出是網頁程式常見操作。只要記住:PHP 的字串連接用 .;要逐段組合一句句子,可用 .= 把片段接到變量後面。
即時示範(模擬器)
示範:計算 + 串接(含括號)
代碼小練習:交換兩個變量
請在下面練習中以 PHP 完成交換,並用「核對答案」檢查輸出是否正確。
小練習:交換 $a 與 $b
Check Point 3:空運行(運算符與字串連接)(≥40 題)
每題提供 3–5 行 PHP 程式碼;請判斷最終輸出(包括輸出的 HTML 內容)。
4條件判斷:if / elseif / else
重點
if用於分支判斷;多重分支可用elseif;最後可用else作預設情況。- 常用比較運算符:
==!=><>=<=。 - 常用邏輯運算符:
&&(AND)、||(OR)、!(NOT)。 - 寫條件時建議加括號,令判斷更清晰,例如:
if (($a >= 10) && ($a <= 20))。
互斥條件判斷是指一組 if / elseif / else 分支在同一次執行中只會選取其中一個分支。if 是第一個條件,elseif 提供後續條件,而 else 負責所有先前條件均不成立的情況。
程式會由上至下逐個計算條件。遇到第一個結果為 true 的條件後,便執行該分支,然後跳過同一分支鏈中其餘的 elseif 與 else。因此,條件的先後次序會直接影響結果。
設計條件時,應把範圍較窄、要求較高或較具體的條件放在前面,再逐步放寬。例如等第判斷應先檢查 $score >= 90,再檢查 $score >= 80。
當 $score 是 95 時,第一個條件已成立,程式不會再檢查第二個條件;當分數是 85 時,第一個條件不成立,第二個條件才會被選取。
- 多個獨立
if:每個條件都會獨立檢查,可能有多個分支同時執行。 if / elseif / else分支鏈:找到第一個成立分支後便停止檢查,適合互斥分類。else:不需要條件,作為未被先前分支涵蓋的預設處理。
- 把一般條件放在具體條件之前,例如先寫
$score >= 60,令較高等第永遠無法到達。 - 把賦值運算符
=當成比較運算符==或嚴格比較運算符===。 - 漏寫
if (...)的圓括號、分支的花括號,或把花括號配對錯誤。 - 誤以為分支鏈會執行所有成立條件,而忽略「第一個成立分支」規則。
互斥判斷與條件次序
if / elseif / else 最適合處理互相排斥的分類,例如把同一個分數分成不同等第。程式會依照源碼次序檢查條件,因此同一組條件即使內容相同,只要排列不同,也可能得到不同結果。閱讀程式時,應逐項寫出條件的真假,並在第一個成立條件出現時停止。
條件由具體至一般排列,可避免較寬鬆的條件過早攔截數據。以分數為例,$score >= 60 同時涵蓋 60、80 及 95;若它放在最前面,後面的 80 分與 90 分分支便沒有機會執行。最後的 else 可處理所有尚未被涵蓋的情況,使分支鏈完整。
比較運算符用來產生布爾結果,邏輯運算符則可把多個比較組合起來。編寫條件時,應先確認每個比較的左右兩邊、括號與花括號是否完整,再檢查是否把 = 誤寫為比較。清楚的縮排亦有助辨認每個分支的範圍。
即時示範(模擬器)
示範:if / elseif / else(按分數輸出等第)
你可嘗試修改 $score,觀察等第輸出如何改變。
代碼小練習:自行撰寫 if 語句
以下小練習要求同時使用比較運算符與邏輯運算符。
小練習:年齡 + 持票(AND 條件)
Check Point 4:條件判斷(if / else if / else)(≥40 題)
以流程判斷、輸出預測、填空/除錯題為主。
5陣列:索引與關聯式陣列
重點
- 索引陣列:以 0,1,2… 作索引,例如
$arr = [10, 20, 30]; - 關聯式陣列:以字串作鍵(key),例如
$user = ["name"=>"Ada", "age"=>18]; - 常用操作:讀取、修改、新增(
$arr[] = ...),以及用函數count()取得元素數量。 foreach最適合遍歷陣列:可逐個取得元素;關聯式陣列亦可同時取得鍵與值。
陣列是一個可在同一變量內保存多個元素的數據結構。索引陣列通常以 0、1、2……作鍵;關聯式陣列則使用例如 name、age 等字串鍵名。每個元素均由一個鍵對應一個值。
讀取元素時,程式以鍵定位相應的值,例如 $scores[0] 或 $user["name"]。修改時,把新值賦予同一鍵;使用新鍵賦值便可新增元素。遍歷陣列時,foreach 會按元素次序逐項提供值,亦可用 foreach ($user as $key => $value) 同時取得鍵和值。
第一個修改以索引 1 找到第二個分數;第二個修改以鍵名 class 找到班別。遍歷時,每次循環會取得一組鍵和值。
- 單一變量:只保存一個值;多筆同類數據需要多個變量,難以統一處理。
- 索引陣列:適合有明確先後次序的同類數據,例如一列分數。
- 關聯式陣列:適合以名稱描述不同欄的同一筆紀錄,例如用戶姓名、班別與角色。
- 誤以為第一個索引是 1,而把
$arr[1]當成第一個元素。 - 讀取不存在的索引,或把
username拼成另一個鍵名,導致未定義鍵。 - 混淆鍵和值,例如把
name當成已儲存的姓名內容。 - 修改陣列副本而非原本元素,或遍歷時忽略需要同時取得鍵的情況。
以鍵組織多筆相關數據
單一變量適合保存一項數據;當程式需要處理一組分數、一批產品或一筆包含多個欄的用戶紀錄時,陣列能把相關值集中管理。索引陣列強調位置與次序,關聯式陣列則強調鍵名所代表的意義,因此選擇哪一種形式取決於程式日後如何讀取數據。
陣列的讀取、修改與新增都以鍵為基礎。對索引陣列而言,鍵通常是由 0 開始的整數;對關聯式陣列而言,鍵名的大小寫與拼法必須一致。修改現有鍵會取代原值,而向新鍵賦值則會建立新元素。
當同一項操作需要套用到每個元素時,應使用循環遍歷,而不是逐項重複書寫源碼。foreach 適合直接取得每個值;若需要位置、序號或按索引修改元素,可使用 for 配合 count(),並留意索引上限是元素數量減一。
代碼小練習:count() 與 foreach
小練習:輸出陣列長度並遍歷元素
Check Point 5:陣列(索引與關聯式陣列)(≥40 題)
以索引/關聯 key、foreach 輸出預測題為主。
6循環:for / while / foreach
重點
- for:適合已知範圍或次數的循環(例如 1 至 10)。
- while:適合按條件停止的循環(例如直到數據讀完)。
- foreach:最適合遍歷陣列,不需手動處理索引;可同時取得鍵與值。
- 循環常與輸出結合,用來重複產生 HTML(例如清單項目
<li>、表格列<tr>)。
循環是讓同一組語句在條件控制下重複執行的結構。for 以計數或索引控制次數,while 在每次開始前檢查繼續條件,foreach 則按陣列中的元素逐項執行。
for 的三個控制部分是初始化、條件及更新:先設定循環變量,再在每次開始前檢查條件,完成主體後更新變量。while 亦需要相同思考,只是初始化通常寫在循環前,更新則寫在循環主體內。foreach 由 PHP 自動移到下一個陣列元素,通常不需自行更新索引。
首兩段都可輸出 1 至 5,但 for 把三個控制部分集中在同一行;第三段則按陣列實際元素數量執行。
- 已知次數或範圍:優先考慮
for,例如重複 10 次或遍歷索引 0 至 9。 - 未知次數、等待條件改變:使用
while,例如讀取至沒有下一筆紀錄。 - 逐項處理陣列:使用
foreach,可減少索引錯誤;需要明確索引時才改用for。
- off-by-one:把
<與<=混淆,令循環少執行或多執行一次。 - 初始化起點錯誤,例如陣列索引應由 0 開始卻由 1 開始。
- 在
while內忘記更新控制變量,令條件永遠成立而形成無限循環。 - 更新方向與條件相反,例如條件要求數值下降,卻使用遞增更新。
按次數、條件或數據集合選擇循環
三種循環都能重複執行語句,但各自表達不同的控制方式。當題目已給定次數或明確的數值範圍時,for 能把起點、繼續條件與更新集中顯示;當停止時機取決於執行期間才知道的狀態時,while 通常較自然。
對陣列進行逐項處理時,foreach 可直接取得每個元素,毋須自行計算索引上限。若工作同時需要索引,例如輸出序號、比較相鄰元素或按位置修改內容,便可使用 for 配合 count()。選擇循環時,應先問「次數是否已知」以及「是否只需逐項取得陣列元素」。
追蹤循環時,可建立表格記錄每次開始時的控制變量、條件結果、輸出及更新後數值。這種方法能快速找出 off-by-one 錯誤。對 while 而言,還要確認循環主體必定有機會令條件變為不成立,否則程式可能一直執行。
即時示範(模擬器)
示範:while 逐列輸出 table
代碼小練習:for/while/陣列遍歷(4 題)
以下以「一行一題」列出。展開題目後會載入模擬器;每題均提供:提示/核對答案/顯示參考答案/講解。
(正在載入練習…)
Check Point 6:循環(for / while / foreach)(≥40 題)
以循環次數、輸出預測、常見錯誤題為主。
✍️頁末代碼題(20 題 Coding)
每題提供:提示/核對答案/顯示參考答案/講解。請在模擬器中完成代碼,然後按「核對答案」檢查。
以下以「一行一題」列出。展開題目後會載入模擬器進行作答;每題均提供:提示/核對答案/顯示參考答案/講解。
(正在載入代碼題…)
總結 課文腦圖總結
重點:
- PHP 在伺服器端執行;瀏覽器收到及顯示的是執行後的 HTML,而不是 PHP 源碼。
- 變量及運算建立數據流,條件決定輸出分支,陣列保存多筆數據,循環重複產生清單或表格結構。
- 字串題要分清單引號、雙引號、變量內插、跳脫字符,以及 PHP 的字串連接運算符「.」。
- 空運行時逐行更新變量,特別留意前置/後置遞增、組合賦值、條件邊界、陣列索引及循環停止。
每個例子都可追蹤「初始值 → 運算或更新 → 條件或循環 → echo 輸出」。先掌握數據如何改變,再記語法會較穩固。
已知次數用 for;依條件停止用 while;直接遍歷陣列用 foreach。需要索引時再用 for 或 foreach 的 key => value。
主要運算、條件、陣列及循環節點均附 PHP 例子。聚焦模式可把畫布移到節點並放大,樹狀圖導覽則可直接跳到指定概念。
本腦圖把全課重整為「請求—回應、程式與輸出、字串、數據運算、條件、陣列、循環、整合排錯」八個互相連結的概念分支。
陣列與循環不再視為兩個獨立語法表:索引或鍵保存多筆數據,for/foreach 再把相同邏輯套用到每筆數據,最後輸出清單項目或表格列。
程式碼節點同時標示變量角色、執行次序及常見錯誤,方便學生由輸出反推數據如何逐步更新。