| 用途 | 函式 | 備註 |
| 取得型別名稱 | gettype($var) | 回傳字串:"integer"/"double"/"string"/"array"/"object"/"resource"/"NULL"/"boolean" |
| 判斷整數 | is_int() / is_long() / is_integer() | |
| 判斷浮點數 | is_float() / is_double() / is_real() | |
| 判斷字串 | is_string() | |
| 判斷布林 | is_bool() | |
| 判斷陣列 | is_array() | |
| 判斷物件 | is_object() | |
| 判斷資源 | is_resource() | |
| 判斷 null | is_null() | |
| 判斷標量 | is_scalar() | int/float/string/bool |
| 判斷數值/數值字串 | is_numeric() | "123", "1.23", 123 皆 true |
| 判斷可呼叫 | is_callable() | 函數名、閉包、實現 __invoke 物件 |
| 強制轉整數 | (int)$var / intval($var[, base]) | intval('0xFF', 16) === 255 |
| 強制轉浮點數 | (float)$var / floatval($var) | |
| 強制轉字串 | (string)$var / strval($var) | |
| 就地改變型別 | settype($var, 'integer') | 回傳 bool,修改原變數 |
三、變數狀態檢測
| 函式 | 判斷條件 | 回傳 | 典型用途 |
isset($var) | 變數存在且 !== null | bool | 檢查陣列鍵、物件屬性、超全域變數 |
empty($var) | 不存在、0、0.0、""、"0"、null、false、[] | bool | 表單驗證、預設值處理 |
unset($var) | 銷毀變數(符號表解除綁定) | void | 釋放大變數、清理迴圈引用 |
四、條件控制結構
<?php
// if/elseif/else
if ($score >= 90) {
$grade = 'A';
} elseif ($score >= 80) {
$grade = 'B';
} else {
$grade = 'C';
}
// 三元運算子 (PHP 8.0+ 左結合)
$status = $isActive ? '啟用' : '停用';
// Null 聯合運算子 (PHP 7.0+)
$name = $input['name'] ?? 'Guest';
// 替代語法(模板檔常用)
if ($cond):
echo "Yes";
elseif ($other):
echo "Maybe";
else:
echo "No";
endif;
五、迴圈控制結構
1. while / do-while
<?php
$i = 0;
while ($i < 5) {
echo $i++;
}
// 至少執行一次
do {
echo $i;
} while ($i < 5);
2. for 迴圈
<?php
for ($i = 0; $i < 10; $i++) {
if ($i === 3) continue; // 跳過 3
if ($i === 7) break; // 在 7 結束
echo $i;
}
// 多重初始/遞增
for ($i = 0, $j = 10; $i < $j; $i++, $j--) {
echo "$i-$j ";
}
3. foreach 迴圈(陣列/物件遍歷首選)
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
// 僅值
foreach ($arr as $val) { echo $val; }
// 鍵值
foreach ($arr as $key => $val) { echo "$key=$val"; }
// 參考修改原陣列
foreach ($arr as &$val) { $val *= 2; }
unset($val); // 重要:解除最後一個元素引用
// 物件遍歷(實現 Iterator/IteratorAggregate)
foreach ($obj as $prop => $val) { /* ... */ }
4. 從控制結構跳出
| 關鍵字 | 作用 | 範圍 |
break | 結束當前 for/foreach/while/do-while/switch | 單層,可 break 2 跳出多層 |
continue | 跳過本次迴圈,進入下一次 | 單層,可 continue 2 |
return | 結束函數並回傳值 | 函數 |
exit/die | 終止整個腳本執行 | 全域 |
throw | 拋出異常 | 可被 try/catch 捕獲 |
六、可變函式與動態呼叫
<?php
$func = 'strlen';
echo $func('hello'); // 5
$obj = new MyClass();
$method = 'doSomething';
$obj->$method(); // 動態呼叫方法
// 靜態方法動態呼叫
$class = 'MyClass';
$method = 'staticMethod';
$class::$method();
// 可變函式陣列映射(路由/分發常用)
$handlers = [
'get' => 'handleGet',
'post' => 'handlePost',
'put' => 'handlePut',
];
$handler = $handlers[$_SERVER['REQUEST_METHOD']] ?? 'handleNotAllowed';
$controller->$handler();
七、實戰範例:運費計算表(while 迴圈輸出 HTML)
<!DOCTYPE html>
運費試算表
| 距離(km) | 費用(元) |
$distance | $cost | \n";
$distance += 50;
}
?>
八、最佳實踐清單
- 預設用 ===/!==,只在確需型別轉換時用 ==/!=。
- 邏輯運算統一用 && || !! ??,禁用 and/or/xor。
- 字串串接加括號:
echo "Sum: " . (1 + 2);。
- foreach 參考後必須 unset($val),防止後續誤用污染陣列最後一元素。
- 迴圈中避免重複計算/查詢:將不變量提到迴圈外、批次查詢資料庫。
- 大量資料用 Generator (yield) 避免一次載入所有記憶體。
- 錯誤抑制 @ 慎用:會隱藏真實錯誤、影響效能,改用
isset()/empty()/try-catch。
總結
熟練掌握 PHP 運算子優先級、型別轉換規則、控制結構語法與迴圈模式,是寫出**正確、高效、可讀**程式碼的基石。建議配合 PHPStan/Psalm 靜態分析、PHP_CodeSniffer 規範檢查,在 CI/CD 流程中自動攔截運算子誤用、型別不匹配、死迴圈等低級錯誤。
copyright ©
萬盛學電腦網 all rights reserved