2026 暑訓 / COURSE 02.01
Day 1 - PHP 複習(上)
PHP 複習,把遺忘的都回憶起來。
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
BrowserServer 只是把已經存在的 HTML 檔案送給 Browser。
動態網頁 Dynamic Web Page
動態網頁就不一樣了。
例如一個需要登入的網站:
使用者 A 登入
→ 顯示使用者 A 的資料
使用者 B 登入
→ 顯示使用者 B 的資料兩個人可能開啟的是同一個網址,但是看到的內容不同。
原因是 Server 在送出網頁以前,先執行了程式。
例如:
Browser
↓
Web Server
↓
PHP Interpreter
↓
Database
↓
PHP 組合資料
↓
產生 HTML
↓
BrowserPHP 可以根據:
- 使用者
- 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_recho
echo 是最常使用的輸出方式之一。
例如:
echo "Hello World";也可以輸出變數:
$name = "John";
echo $name;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
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
switchif / 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
其他
→ #ffffffswitch
同一個功能也可以使用:
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.4return 的概念是:
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