PHP 函式是程式碼重用、模組化、封裝邏輯的核心單位。掌握參數傳遞、作用域、預設值、參考傳遞等進階特性,能寫出彈性高、可維護的函式庫。
<?php
function 函式名稱(參數1, 參數2 = 預設值, ...參數陣列) : 回傳型別宣告 {
// 函式主體
return 回傳值;
}
?>
function sum(...$numbers) { // 可變參數 (PHP 5.6+)
return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 10
myFunc()、MYFUNC()、MyFunc() 皆指向同一函式。snake_case (PHP 標準) 或 camelCase。$x = 10;
function test() {
$x = 20; // 區域變數,不影響外部
echo $x; // 20
}
test();
echo $x; // 10 (外部未變)
$a = 12;
function abc() {
global $a; // 宣告使用全域 $a
$a += 45;
}
abc();
echo $a; // 57 (全域變數被修改)
替代方案:$GLOBALS['a'] 陣列存取,不需 global 宣告。
$a = 12;
function abc($a) {
unset($a); // 釋放區域參數 $a 參考
$a = 45; // 新區域變數
}
abc($a);
echo $a; // 12 (全域未受影響)
function abc($b, $a = 2) { // 預設值參數必須在非預設參數之後
return $a + $b;
}
echo abc(70); // 72 (使用預設 $a=2)
echo abc(70, 90); // 160 (覆蓋預設值)
| 傳遞方式 | 語法 | 行為 | 適用場景 |
|---|---|---|---|
| 傳值 (預設) | function foo($x) | 複製值,函式內修改不影響外部 | 純量、陣列 (複製整個陣列)、物件 (複製參考) |
| 傳參考 | function foo(&$x) | 傳遞變數記憶體位址,函式內修改直接影響外部 | 需修改原變數、大型陣列避免複製、效能敏感 |
$a = 213;
function abc(&$b) {
$b = 314;
}
abc($a);
echo $a; // 314 (被修改)
function add(int $a, int $b) : int {
return $a + $b;
}
function getUser(int $id) : ?User { // 可為 null
return User::find($id);
}
declare(strict_types=1); // 檔案頂端,強制型別檢查
function add(int $a, int $b) : int {
return $a + $b;
}
add(1.5, 2); // TypeError: Argument must be int, float given
全域空間 ($GLOBALS)
├─ $a = 10
├─ $b = 'test'
└─ function test() {
區域空間
├─ $a = 20 (遮蔽全域)
├─ global $b (連結全域 $b)
└─ $c = 30 (僅區域可見)
}
calculateTotal, validateEmail)。@param Type $var [in/out],呼叫端明知會被修改。declare(strict_types=1),捕獲 90% 型別 Bug。精通 PHP 函式進階特性,是從「寫得動」進化到「寫得好、好維護、好擴充」的關鍵里程碑。