函數聲明基礎
function sum(int $x, int $y): int {
return $x * $x + $y * $y;
}
echo sum(3, 4); // 25
變量作用域鐵律
- 函數內部無法直接訪問外部變量(除非
global 或 $GLOBALS)
- 函數外部無法直接訪問內部變量(除非
return 或引用傳遞)
- 參數傳遞默認按值(複製副本),對象/資源傳遞的是句柄引用
global 關鍵字實戰
$a = 10;
function demo() {
global $a;
$a += 10;
echo $a . " demo\n"; // 20
}
demo();
echo $a . " global\n"; // 20
demo(); // 30
echo $a . " again\n"; // 30
靜態變量:函數級「單例」狀態
function counter() {
static $count = 0; // 僅初始化一次
$count++;
echo $count . "\n";
}
counter(); // 1
counter(); // 2
counter(); // 3
- 存儲在靜態存儲區,生命周期 = 整個腳本運行期間
- 僅在聲明所在函數可見,實現封裝狀態
- 遞歸、累加器、緩存、單次初始化常用
變量函數:動態調用
function one($a, $b) { return $a + $b; }
function two($a, $b) { return $a * $a + $b * $b; }
function three($a, $b) { return $a ** 3 + $b ** 3; }
$func = 'two';
echo $func(3, 4); // 25
// 陣列調用
$map = ['one' => 'one', 'two' => 'two'];
echo $map['two'](3, 4); // 25
內部函數參數分類識讀手冊
| 原型特徵 | 含義 | 調用示例 |
mixed $arg | 接受任意類型 | var_dump($any) |
&$arg | 引用傳遞(必須傳變量) | sort($arr) 修改原數組 |
$arg = default | 可選參數,有默認值 | json_encode($data, JSON_PRETTY_PRINT) |
...$args | 可變參數(打包為數組) | array_merge(...$arrays) |
callable $cb | 回調類型聲明 | array_filter($arr, fn($v)=>$v>0) |
func_* 族函數:無簽名可變參數(PHP 5.6 前)
function sumAll() {
$sum = 0;
for ($i = 0; $i < func_num_args(); $i++) {
$sum += func_get_arg($i);
}
return $sum;
}
echo sumAll(1,2,3,4,5); // 15
// 現代寫法(PHP 5.6+)
function sumAll(...$nums) {
return array_sum($nums);
}
回調函數四種可調用類型
// 1. 普通函數名字符串
'strlen'
// 2. 靜態方法
'MyClass::staticMethod'
// 3. 實例方法
[$obj, 'method']
// 4. 匿名函數 / 閉包
fn($x) => $x * 2
function($x) { return $x * 2; }
// 5. 可調用對象(實現 __invoke)
class Multiplier {
public function __invoke($x) { return $x * $this->factor; }
}
$double = new Multiplier(2);
array_map($double, [1,2,3]);
內置排序函數對比(引用修改原數組)
| 函數 | 排序依據 | 保留鍵 | 穩定性 |
sort | 值升序 | ❌ 重建索引 | 不穩定 |
rsort | 值降序 | ❌ | 不穩定 |
asort | 值升序 | ✅ | 穩定 (PHP 8+) |
arsort | 值降序 | ✅ | 穩定 |
ksort | 鍵升序 | ✅ | 穩定 |
krsort | 鍵降序 | ✅ | 穩定 |
usort | 用戶回調比較值 | ❌ | 不穩定 |
uasort | 用戶回調比較值 | ✅ | 穩定 |
uksort | 用戶回調比較鍵 | ✅ | 穩定 |
array_filter 回調實戰
$data = [1, 2, -3, 4, -5, 6, -7, 8, 9];
// 保留偶數
$even = array_filter($data, function($n) {
return $n % 2 === 0;
});
// [1 => 2, 3 => 4, 5 => 6, 7 => 8]
// 保留鍵為偶數的元素
$evenKeys = array_filter($data, function($v, $k) {
return $k % 2 === 0;
}, ARRAY_FILTER_USE_KEY);