2026 暑訓 / COURSE 02.01

Day 1 - PHP 複習(上)

PHP 複習,把遺忘的都回憶起來。

INSTRUCTOR王朝威UPDATED2026.08.23

CakePHP 是建立在 PHP 之上的 Web Framework,因此在正式開始 CakePHP 之前,我們先花一點時間把之後開發會使用到的 PHP 基礎重新整理一次。

如果 PHP 基礎不熟,在之後看到 CakePHP Controller、Model、View 或 Template 中的程式碼時,很容易分不清楚哪些是 CakePHP 提供的功能,哪些又只是 PHP 本身的語法。

這一章將快速複習:

  • PHP 基本概念
  • PHP 執行環境
  • 基本語法
  • 變數與資料型態
  • 輸出
  • 變數作用域
  • 常數
  • 運算子
  • 陣列
  • 條件判斷
  • 迴圈
  • 函式

這些內容都會在後續 CakePHP 的開發中不斷出現。


1. PHP 是什麼?

PHP 的全名是:

PHP: Hypertext Preprocessor

中文通常翻譯為「超文字預處理器」。

PHP 是一種廣泛使用於網站後端的伺服器端腳本語言(Server-side Scripting Language)。

它與我們常見的 JavaScript 有一個很重要的差異:

PHP 主要在 Server 上執行,而不是在 Browser 中執行。

當使用者瀏覽一個 PHP 網頁時,大致會發生以下流程:

Browser 發出 Request
        ↓
Web Server 接收 Request
        ↓
PHP Interpreter 執行 PHP
        ↓
產生 HTML
        ↓
Web Server 回傳 Response
        ↓
Browser 顯示 HTML

所以瀏覽器實際收到的不是 PHP 原始碼,而是 PHP 執行完成之後所產生的結果。

例如伺服器中有:

<?php
echo "Hello World!";
?>

瀏覽器最後收到的內容可能只是:

Hello World!

使用者並不會直接看到:

echo "Hello World!";

也就是說,PHP 原始程式是在 Server 上處理的。

PHP 檔案通常使用:

.php

作為副檔名。

而一份 .php 檔案裡面也可以同時包含:

HTML
CSS
JavaScript
PHP

因此 PHP 很適合用來產生動態網頁。


2. 靜態網頁與動態網頁

在理解 PHP 之前,需要先區分兩個概念:

Static Web Page 與 Dynamic Web Page。

靜態網頁 Static Web Page

例如一個單純的:

index.html

如果裡面寫:

<h1>Hello World</h1>

那麼不管是誰開啟這個網頁,看到的通常都是:

Hello World

除非有人修改 index.html,否則內容本身不會改變。

流程可以簡化成:

Browser
   ↓ Request
Web Server
   ↓ Response
Browser

Server 只是把已經存在的 HTML 檔案送給 Browser。


動態網頁 Dynamic Web Page

動態網頁就不一樣了。

例如一個需要登入的網站:

使用者 A 登入
→ 顯示使用者 A 的資料

使用者 B 登入
→ 顯示使用者 B 的資料

兩個人可能開啟的是同一個網址,但是看到的內容不同。

原因是 Server 在送出網頁以前,先執行了程式。

例如:

Browser
   ↓
Web Server
   ↓
PHP Interpreter
   ↓
Database
   ↓
PHP 組合資料
   ↓
產生 HTML
   ↓
Browser

PHP 可以根據:

  • 使用者
  • Request
  • 表單資料
  • Database 資料
  • Session
  • Cookie

產生不同的內容。

這就是所謂的動態網頁。

而我們之後使用 CakePHP 建立的,就是這種類型的 Web Application。


3. 建立 PHP Docker 環境

接下來需要準備一個可以執行 PHP 的環境。

本教學使用 Docker 建立 PHP + Apache 環境。

執行:

docker run --name php -p 8080:80 php:8.5-apache

這條指令可以拆成幾個部分來看。

docker run

docker run

表示建立並啟動一個新的 Container。

可以暫時把 Container 想成一個獨立的執行環境。


--name php

--name php

替 Container 設定名稱:

php

之後就可以透過名稱操作這個 Container。


-p 8080:80

-p 8080:80

代表 Port Mapping。

格式為:

Host Port : Container Port

因此:

8080 : 80

表示:

localhost:8080

會連到 Container 裡 Apache 所使用的:

Port 80

所以稍後我們可以透過:

http://localhost:8080

進入 PHP 網站。


php:8.5-apache

php:8.5-apache

代表這次建立 Container 所使用的 Image。

這個 Image 中已經包含:

PHP 8.5
Apache

因此不用另外安裝 PHP 與 Apache。


背景執行 Container

如果不希望 Container 一直佔用目前的 Terminal,可以加入:

-d

例如:

docker run -d --name php -p 8080:80 php:8.5-apache

這樣 Container 就會在背景執行。


4. 使用 VS Code 進入 Container

Container 啟動之後,可以透過 VS Code 的 Dev Containers 功能進入。

按下:

F1

搜尋:

Dev Containers: Attach To Running Container

接著選擇:

php

進入 Container 後,前往:

/var/www/html

這個目錄是 Apache 預設的網站根目錄。

之後的 PHP 練習檔案,例如:

01.php
02.php
03.php
04.php

都會建立在這個目錄中。

例如建立:

/var/www/html/01.php

就可以透過:

http://localhost:8080/01.php

查看結果。

如果不小心開啟錯誤的 VS Code 工作區,可以使用:

Ctrl + K

放開之後再按:

F

也就是:

Ctrl + K, F

關閉目前資料夾。


5. PHP 基本語法 Syntax

PHP 程式通常使用:

<?php

表示 PHP 程式開始。

並可以使用:

?>

表示 PHP 程式結束。

例如:

<?php
echo "Hello World!";
?>

PHP 也可以直接嵌入 HTML。

例如建立 01.php:

<!DOCTYPE html>
<html lang="zh-tw">

<head>
    <title>Hello World!</title>
    <meta charset="utf-8">
</head>

<body>

<?php
echo "Hello World from echo!";
ECHo "<br>";
printf("%s", "Hello World from printf!");
?>

</body>
</html>

當 Apache 處理這個檔案時,會先執行 PHP,再把結果組合成 HTML 回傳給 Browser。


PHP 關鍵字大小寫

從範例可以看到:

echo "Hello";

與:

ECHo "Hello";

都可以執行。

PHP 的部分關鍵字並不區分大小寫。

不過實務開發仍建議統一使用小寫:

echo

讓程式碼風格保持一致。


6. PHP 變數 Variable

PHP 的變數以:

$

開始。

例如:

$name = "John";
$age = 20;

PHP 變數名稱可以使用:

a-z
A-Z
0-9
_

但是不能直接用數字開頭。

例如:

$name = "John";     // 可以
$user_name = "Tom"; // 可以
$name2 = "Amy";     // 可以

而:

$2name = "John";

是不正確的。


PHP 變數區分大小寫

PHP 變數是 Case-sensitive 的。

例如:

$a = 10;
$A = 20;

這是兩個不同的變數。


7. PHP 常見資料型態

PHP 中常見的資料型態包括:

int
float
bool
null
string
array
object

例如:

$a = 3;
$b = 3.0;
$c = "Hello World";
$d = true;
$e = null;
$f = [1, 2, 3];

其中:

$a = 3;

是 Integer。

$b = 3.0;

是 Float。

$c = "Hello World";

是 String。

$d = true;

是 Boolean。

$e = null;

代表目前沒有值。

$f = [1, 2, 3];

則是一個 Array。


8. PHP 字串連接

PHP 使用:

.

連接字串。

例如:

$a = "Hello";
$b = "World";

$c = $a . $b;

結果:

HelloWorld

如果希望中間有空格:

$c = $a . " " . $b;

結果:

Hello World

這個 . 在之後的 PHP 與 CakePHP 程式碼中非常常見。


9. PHP 輸出 Output

PHP 有許多不同的方式可以輸出資料。

常見的包括:

echo
print
printf
var_dump
print_r

echo

echo 是最常使用的輸出方式之一。

例如:

echo "Hello World";

也可以輸出變數:

$name = "John";
echo $name;

print

print 與 echo 很相似。

例如:

print "Hello World";

在基本輸出情境中,兩者都可以用來顯示內容。


printf

printf() 可以進行格式化輸出。

例如:

$name = "John";
$age = 20;

printf("Name: %s, Age: %d", $name, $age);

常見格式包括:

%d  整數
%u  無符號整數
%f  浮點數
%s  字串

var_dump

開發時經常需要知道一個變數:

現在是什麼型態?
裡面存了什麼?

這時可以使用:

var_dump();

例如:

$a = 3;
var_dump($a);

可能會得到:

int(3)

如果:

$b = 3.0;
var_dump($b);

則可以看到 Float 的資訊。


print_r() 很適合查看 Array 的內容。

例如:

$arr = [1, 2, 3];
print_r($arr);

10. 使用 var_dump 查看資料型態

建立 02.php:

<?php

$a = 3;
$b = 3.0;
$d = true;
$e = null;
$c = "Hello" . "World";
$f = [1, 2, 3];
$g = [
    "dog" => "狗",
    "cat" => "貓",
    "bee" => "蜂"
];

var_dump($a); echo "<br>";
var_dump($b); echo "<br>";
var_dump($c); echo "<br>";
var_dump($d); echo "<br>";
var_dump($e); echo "<br>";
var_dump($f); echo "<br>";
var_dump($g);

這個範例一次展示了:

int
float
string
bool
null
array

幾種常見資料型態。


11. 單引號與雙引號

PHP 的字串可以使用:

""

或:

''

但是兩者在變數處理上有一個重要差異。

雙引號:

""

會進行變數解析。

單引號:

''

通常會把內容直接當成普通字串。

例如建立 03.php:

<?php

$test = "Hello";
$test2 = "World!";
$test3 = $test . $test2;

$arr = [1, 2, 3];
$arr[] = 4;

echo "$test3";
echo "<br>";

var_dump($arr);
echo "<br>";

print 'This is a $test {$arr[0]}, {$arr[1]}';
echo "<br>";

print "This is a $test $arr[0], $arr[1]";
echo "<br>";

printf("This is a %s %d", $test, $arr[0]);

觀察:

print 'This is a $test';

與:

print "This is a $test";

輸出的差異。

在後面的 CakePHP View 中,我們經常需要將變數內容輸出到 HTML,因此理解字串與變數解析非常重要。


12. 變數作用域 Scope

變數不一定在所有地方都能直接使用。

PHP 中會遇到:

Local Scope
Global Scope
Static Variable

投影片介紹了三種常見方式:

$GLOBALS
global
static

$GLOBALS

假設函式外有:

$a = 3;

函式裡又有自己的:

$a = 5;

例如:

$a = 3;

function test1() {
    $a = 5;

    echo "local a = $a";
    echo "global a = " . $GLOBALS['a'];
}

函式內的:

$a

與外面的:

$a

不是同一個變數。

如果希望透過 $GLOBALS 存取全域變數,可以寫:

$GLOBALS['a']

global

也可以在函式中使用:

global

例如:

$a = 3;

function test2() {
    global $a;
    echo $a;
    ++$a;
}

這時函式裡使用的 $a 就會指向外面的全域變數。


static

一般函式中的區域變數,在函式執行結束之後,下次再次呼叫時會重新建立。

如果加入:

static

則可以保留上一次呼叫所留下來的值。

例如:

function test3() {
    static $a = 0;
    echo $a;
    ++$a;
}

第一次:

test3();

會從:

0

開始。

第二次再:

test3();

時,不會重新變成 0,而是使用前一次留下的值。

完整範例 04.php:

<?php

$a = 3;

function test1() {
    $a = 5;
    echo "<br>In test1, local a = $a, ";
    echo "global a=" . $GLOBALS['a'];
}

function test2() {
    global $a;
    echo "<br>In test2, a = $a";
    ++$a;
}

function test3() {
    static $a = 0;
    echo "<br>In test3, a = $a";
    ++$a;
}

test1();
test2();
test2();
test1();
test3();
test3();

建議實際執行一次,再觀察每一次 $a 的變化。


13. 常數 Constant

變數的內容可以修改:

$name = "John";
$name = "Tom";

但是常數在定義完成之後,主要用途就是保存不希望在程式執行過程中改變的值。

與變數不同,常數名稱前面沒有:

$

PHP 中可以使用:

const
define()

定義常數。


使用 const

例如:

const con_g = "const in golbal";

之後直接使用:

echo con_g;

而不是:

echo $con_g;

使用 define()

也可以使用:

define("def_g", "define in golbal");

之後:

echo def_g;

在投影片的範例中,define() 也展示了在函式內建立常數的情況。

建立 05.php:

<?php

const con_g = "const in golbal";
define("def_g", "define in golbal");

function test() {
    // Error
    // const con_l = "const in local";
    define("def_l", "define in local");

    echo con_g . "<br>";
    echo def_g . "<br>";
    echo def_l . "<br>";
}

test();

echo con_g . "<br>";
echo def_g . "<br>";
echo def_l . "<br>";

這裡最重要的是理解:

Constant 與 Variable 是不同概念。

Variable:

$name = "John";

Constant:

define("APP_NAME", "My App");

或:

const APP_NAME = "My App";

14. 運算子 Operator

PHP 提供許多我們在其他程式語言中也常見的運算子。

算術運算

+
-
*
/
%
**
++
--

例如:

$a = 10;
$b = 3;

echo $a + $b;
echo $a - $b;
echo $a * $b;
echo $a / $b;
echo $a % $b;

比較運算

常見比較運算子:

<
<=
>
>=
==
!=
===
!==

PHP 特別需要注意:

==
===

以及:

!=
!==

的差異。

投影片的例子:

"3.14" == 3.14;

結果為:

true

而:

"3.14" === 3.14;

結果為:

false

因為:

"3.14"

是 String。

而:

3.14

是 Float。

使用:

==

比較時,主要比較轉換後的值。

使用:

===

時,型態也必須一致。

因此:

"3.14" != 3.14;

為:

false

但:

"3.14" !== 3.14;

則為:

true

邏輯運算

常見邏輯運算子:

&&
||
!

例如:

if ($username == "admin" && $password == "1234") {
    echo "Login success";
}

後面的表單處理就會實際使用到這種寫法。


指派運算

=
+=
-=
*=
/=
%=

例如:

$a = 10;
$a += 5;

相當於:

$a = $a + 5;

15. Spaceship Operator

PHP 還有一個比較特別的:

<=>

稱為 Spaceship Operator,中文有時稱為「太空船運算子」。

例如:

$a <=> $b

結果可能為:

-1
0
1

當左邊比較小時:

-1

兩邊相等時:

0

右邊比較小時:

1

它可以用來快速判斷兩個值之間的相對大小。


16. 陣列 Array

PHP 的 Array 是非常重要的資料結構。

CakePHP 後面大量的設定、URL、資料處理都會使用 Array。

PHP 有兩種常見 Array 語法:

array(...)

以及較常見的:

[...]

例如:

$arr = [1, 2, 3];

PHP 的 Array 實際上可以看成一種:

Key => Value

的資料結構。

例如:

$animals = [
    "dog" => "狗",
    "cat" => "貓",
    "bee" => "蜂"
];

其中:

dog
cat
bee

是 Key。

而:

狗
貓
蜂

是 Value。


自動產生 Key

如果沒有指定 Key:

$arr = [
    "A",
    "B",
    "C"
];

PHP 會自動產生數字 Key。

概念上類似:

$arr = [
    0 => "A",
    1 => "B",
    2 => "C"
];

Array Key

PHP Array 的 Key 主要會是:

Integer
String

投影片提供了一個很適合觀察 Key 轉換的範例。

建立 06.php:

<?php

$array1 = array(
    2 => "a",
    "3" => "b",
    4.5 => "c",
    true => "d",
    null => "e",
);

$array2 = [
    "fruit" => "kiwi",
    "Str1",
    "kiwi" => "fruit",
    "Str2",
    100 => -100,
    -100 => 100,
    "Str3",
];

print_r($array1);
echo "<br>";

var_dump($array1);
echo "<br>";
echo "<br>";

var_dump($array2);

執行之後可以觀察不同 Key 寫法最後會產生什麼結果。

例如投影片中特別提醒:

4.5
true
"1"
null

等值在作為 Array Key 時可能產生型態轉換。

這也是為什麼理解 PHP Array 很重要。


17. 條件判斷 Branch

PHP 的條件判斷與 C、C++、JavaScript 等語言非常相似。

常見的有:

if
elseif
else
switch

if / elseif / else

例如:

$coler = "red";

if ($coler == "red") {
    echo "#ff0000";
} elseif ($coler == "green") {
    echo "#00ff00";
} elseif ($coler == "blue") {
    echo "#0000ff";
} else {
    echo "#ffffff";
}

流程就是:

如果是 red
→ #ff0000

否則如果是 green
→ #00ff00

否則如果是 blue
→ #0000ff

其他
→ #ffffff

switch

同一個功能也可以使用:

switch

改寫。

建立 07.php:

<?php

$coler = "red";
switch ($coler) {
    case "red":
        echo "#ff0000";
        break;
    case "green":
        echo "#00ff00";
        break;
    case "blue":
        echo "#0000ff";
        break;
    default:
        echo "#ffffff";
        break;
}

switch 中也可以使用字串作為 Case 的比較值。


18. 迴圈 Loop

PHP 提供常見的迴圈:

for
foreach
while
do...while

並且可以搭配:

break
continue

使用。

其中在 PHP Web 開發中非常常看到的是:

foreach

因為我們經常需要遍歷 Array 或資料庫查詢結果。


foreach

例如建立一個關聯陣列:

$a = [
    "dog" => 1,
    "cat" => 2,
    "mouse" => 3,
    "horse" => 4,
];

如果希望同時取得:

Key
Value

可以寫:

foreach ($a as $k => $v) {
    echo "Key: $k, Value: $v <br>";
}

其中:

$k

代表 Key。

$v

代表 Value。

因此會依序取得:

dog   → 1
cat   → 2
mouse → 3
horse → 4

只取得 Value

如果不需要 Key,也可以寫:

foreach ($a as $v) {
    echo "$v";
}

完整的 08.php:

<?php

$a = [
    "dog" => 1,
    "cat" => 2,
    "mouse" => 3,
    "horse" => 4,
];

foreach ($a as $k => $v) {
    echo "Key: $k, Value: $v <br>";
}

foreach ($a as $v) {
    echo "$v";
}

這種寫法在後續 CakePHP 顯示文章列表時會再次看到。

概念通常是:

foreach ($articles as $article) {
    // 顯示每篇文章
}

因此 foreach 是這一天非常重要的複習內容。


19. 函式 Functions

當一段程式需要重複使用時,可以將它包裝成 Function。

最基本的 Function:

function func1() {
    echo "Hello World!";
}

呼叫:

func1();

有參數的 Function

Function 也可以接收參數。

例如:

function func2($arg1, $arg2) {
    echo $arg1 . $arg2;
}

呼叫:

func2("Hello", "World!");

結果:

HelloWorld!

其中:

$arg1
$arg2

就是函式的參數。


預設參數

PHP Function 可以設定 Default Parameter。

例如:

function func3(int $arg1 = 10, int $arg2 = 5) {
    echo $arg1 + $arg2;
    echo "<br>";
}

可以有不同呼叫方式:

func3(4, 1);

兩個參數都有提供:

4 + 1

只提供第一個:

func3(5);

第二個就使用預設值:

5

因此:

5 + 5

也可以使用 Named Argument:

func3(arg2: 10);

這代表直接指定:

arg2 = 10

而 arg1 使用預設值。


如果完全不提供:

func3();

就全部使用 Default Value:

arg1 = 10
arg2 = 5

匿名函式 Anonymous Function

PHP 也支援匿名函式。

一般函式會有名稱:

function hello() {
    echo "Hello";
}

匿名函式則沒有函式名稱,可以將它放入一個變數。

例如:

$func4 = function ($name) {
    echo "Hi " . $name;
};

接著:

$func4('John');

結果:

Hi John

這種 Function 後面在處理 Callback 時非常常見。


函式回傳值 Function Return Value

Function 不一定直接:

echo

也可以:

return

一個結果。

例如:

function addNumbers1(float $num1, float $num2) {
    return $num1 + $num2;
}

呼叫:

echo addNumbers1(1.2, 5.2);

結果:

6.4

return 的概念是:

Function 計算
↓
把結果傳回呼叫它的位置

所以也可以:

$result = addNumbers1(1.2, 5.2);
echo $result;

宣告參數型態

PHP Function 可以宣告參數型態。

例如:

function addNumbers1(float $num1, float $num2)

表示:

$num1 → float
$num2 → float

這種寫法在後面的 CakePHP 5.x 程式碼會非常常看到。


宣告回傳型態

除了參數型態,也可以宣告 Return Type。

例如:

function addNumbers2(float $num1, float $num2): int {
    return $num1 + $num2;
}

其中:

: int

代表這個 Function 宣告回傳:

int

完整範例:

echo addNumbers2(1.2, 5.2);

投影片的輸出範例為:

6

這種型態宣告在 CakePHP 中非常重要。

之後會看到大量類似:

public function initialize(array $config): void

或:

public function validationDefault(Validator $validator): Validator

其中:

array
Validator

是 Parameter Type。

而:

void
Validator

則是 Return Type。

因此現在理解 PHP Function 的型態宣告,後面閱讀 CakePHP 程式碼會容易很多。


匿名函式與 use

匿名函式如果希望取得函式外部的變數,可以使用:

use

例如:

$name = "John";

$func5 = function () use ($name) {
    echo "Hi " . $name;
};

執行:

$func5();

會得到:

Hi John

接著:

$name = "Tom";

再次:

$func5();

這個範例可以用來觀察匿名函式透過 use 取得外部變數時的行為。

完整程式:

$name = "John";
$func5 = function () use ($name) {
    echo "Hi " . $name;
};

$func5();
$name = "Tom";
$func5();

傳參考 Pass by Reference

一般情況下,Function 的參數使用:

$value

如果在參數前加入:

&

則可以使用 Reference 的方式操作變數。

例如:

function add_five(&$value) {
    $value += 5;
}

原本:

$num = 2;

執行:

add_five($num);

因為 $value 是 Reference,所以 Function 裡面的修改會直接影響原本的:

$num

最後:

echo $num;

結果:

7

完整範例:

function add_five(&$value) {
    $value += 5;
}

$num = 2;
add_five($num);
echo $num;

這裡最大的重點是:

一般參數可以理解成把值交給 Function 使用,而 Reference 則允許 Function 直接修改外部的變數。


Day 1 前半段小結

到這裡,我們已經完成 PHP 最重要的一批基礎語法複習:

PHP Server-side 執行概念
        ↓
Docker PHP 開發環境
        ↓
PHP Syntax
        ↓
Variable
        ↓
Data Type
        ↓
Output
        ↓
Scope
        ↓
Constant
        ↓
Operator
        ↓
Array
        ↓
Branch
        ↓
Loop
        ↓
Function

這些東西看起來只是 PHP 基礎,但接下來開始 CakePHP 後會全部重新出現。

例如:

$articles = [...]

是 Variable 與 Array。

foreach ($articles as $article)

是 Loop。

if ($this->request->is('post'))

是 Branch。

public function add()

是 Function。

public function initialize(array $config): void

則同時包含 Function、Parameter Type 與 Return Type。

所以 Day 1 的目的並不是重新完整學一次 PHP,而是先把閱讀 CakePHP 程式碼需要的基礎語法重新建立起來。

下一部分,我們會開始把這些語法真正用在 Web 上:

Exercise → HTML Form → GET / POST → $_POST → $_FILES → 檔案上傳 → Fetch → JSON

這也是從「PHP 語法」進入「PHP Web 開發」的重要分界。

COURSE FILES

附件下載

FILE2026 CakePHP-Day1 PHP複習.pdf下載 ↓
NEXT COURSE / 02.02Day 1 - PHP 複習(下) →