萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 運算子與控制結構完整參考手冊:從算術到迴圈的實戰指南

一、運算子完整分類與優先級

PHP 運算子遵循 **優先級**(誰先算)與 **結合性**(同級誰先算)規則。完整優先級表(高→低)見官方文檔,常用摘要:

優先級運算子結合性範例
1 (最高)clone new不結合new Foo()
2[] (array)右[1,2,3]
3++ -- ~ (int) (float) (string) (array) (object) (bool) @右++$a, (int)$b
4instanceof不結合$obj instanceof Foo
5! ~右!$a
6* / %左$a * $b
7+ - .左$a + $b, "a"."b"
8<< >> >>> (PHP 8.0+)左$a << 2
9< <= > >=不結合$a < $b
10== != === !== <> <=>不結合$a === $b
11&左$a & $b
12^左$a ^ $b
13|左$a | $b
14&&左$a && $b
15||左$a || $b
16?? (null 聯合)左$a ?? $b
17? : (三元)**左** (PHP 8.0+ 左結合)$a ? $b : $c
18= += -= *= /= %= **= .= &= |= ^= <<= >>= ??=右$a += 1
19 (最低)and or xor左$a and $b

關鍵差異提醒

  • and/or 優先級**極低**,低於 =:$a = true and false 相當於 ($a = true) and false → $a = true。建議統一用 && ||。
  • ?? (null 聯合) 僅判斷 null,?: (Elvis) 判斷 **falsy**(0、""、[]、false、null 皆為 false)。
  • === 嚴格比較(型別+值),== 鬆散比較(會觸發型別轉換,**極易出錯**,如 "0e123" == "0e456" // true 科學記號陷阱)。**強烈建議預設用 ===**。
  • . 字串串接優先級高於 +:"Sum: " . 1 + 2 → ("Sum: " . 1) + 2 → "Sum: 1" + 2 → 3(字串轉數字)。**串接請加括號**。

二、型別檢測與轉換函式

三、變數狀態檢測

用途函式備註
取得型別名稱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()
判斷 nullis_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)變數存在且 !== nullbool檢查陣列鍵、物件屬性、超全域變數
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>

運費試算表

\n";
        $distance += 50;
    }
    ?>
距離(km)費用(元)
$distance$cost

八、最佳實踐清單

  1. 預設用 ===/!==,只在確需型別轉換時用 ==/!=。
  2. 邏輯運算統一用 && || !! ??,禁用 and/or/xor。
  3. 字串串接加括號:echo "Sum: " . (1 + 2);。
  4. foreach 參考後必須 unset($val),防止後續誤用污染陣列最後一元素。
  5. 迴圈中避免重複計算/查詢:將不變量提到迴圈外、批次查詢資料庫。
  6. 大量資料用 Generator (yield) 避免一次載入所有記憶體。
  7. 錯誤抑制 @ 慎用:會隱藏真實錯誤、影響效能,改用 isset()/empty()/try-catch。

總結

熟練掌握 PHP 運算子優先級、型別轉換規則、控制結構語法與迴圈模式,是寫出**正確、高效、可讀**程式碼的基石。建議配合 PHPStan/Psalm 靜態分析、PHP_CodeSniffer 規範檢查,在 CI/CD 流程中自動攔截運算子誤用、型別不匹配、死迴圈等低級錯誤。

copyright © 萬盛學電腦網 all rights reserved