算術運算符是 PHP 程序進行數學計算的基礎。本文整理完整運算符表格,重點解析優先級規則、類型自動轉換行為及常見陷阱,助你寫出無 Bug 的計算邏輯。
| 運算符 | 名稱 | 說明 | 示例 | 結果 |
|---|---|---|---|---|
+ | 加法 | 兩數相加 | 2 + 3 | 5 |
- | 減法 | 兩數相減 | 5 - 2 | 3 |
* | 乘法 | 兩數相乘 | 5 * 2 | 10 |
/ | 除法 | 兩數相除,**永遠返回浮點數** | 15 / 5 | 3.0 |
% | 取模(餘數) | 除法餘數,結果符號與被除數一致 | 5 % 210 % 810 % 2 | 120 |
** | 冪運算 | 次方(PHP 5.6+) | 2 ** 3 | 8 |
- | 取負 | 一元運算符,取反數值 | -$a | -10 (若 $a=10) |
. | 字符串連接 | 非算術,但優先級高於加減 | "Hi" . "Ha" | "HiHa" |
**(右結合)+ - ~(一元,右結合)* / %(左結合)+ -(二元,左結合).(左結合)<?php echo 2 + 3 * 4; // 14 (* 優先於 +) echo (2 + 3) * 4; // 20 (括號提升優先級) echo 2 ** 3 ** 2; // 512 (右結合:2 ** (3 ** 2) = 2 ** 9) echo -2 ** 2; // -4 (** 優先於一元 -:-(2**2)) echo (-2) ** 2; // 4 ?>
PHP 算術運算會自動將操作數轉換為數值類型:
| 原始值 | 轉換為數值 | 說明 |
|---|---|---|
true | 1 | 布爾值 |
false | 0 | |
"123" | 123 | 純數字字符串 |
"10.5" | 10.5 | 浮點字符串 |
"abc" | 0 | 非數字開頭 → 0 並觸發 E_NOTICE |
"5abc" | 5 | 數字開頭 → 取前導數字部分 |
[] | 0 | 空陣列 → 0 |
[1,2] | 1 | 非空陣列 → 1 並觸發 E_NOTICE |
null | 0 |
$a = 10 / 4; // 2.5 (float), 不是 2 // 需整數除法用 intdiv() (PHP 7+) 或 (int)($a/$b) echo intdiv(10, 4); // 2
echo -5 % 3; // -1 (結果符號跟隨被除數) echo 5 % -3; // 1
echo "結果:" . 2 + 3; // 輸出 3 (!)
// 解析為 ("結果:" . 2) + 3 → "結果:2" 轉數值 0 + 3 = 3
// 正確寫法:
echo "結果:" . (2 + 3); // "結果:5"
echo 0.1 + 0.7; // 0.7999999999999999
// 金額計算請用 BCMath 或整數分單位
echo bcadd('0.1', '0.7', 2); // "0.80"
<?php $x = 10; $y = 6; echo "加法: " . ($x + $y) . "\n"; // 16 echo "減法: " . ($x - $y) . "\n"; // 4 echo "乘法: " . ($x * $y) . "\n"; // 60 echo "除法: " . ($x / $y) . "\n"; // 1.666... echo "取模: " . ($x % $y) . "\n"; // 4 echo "冪運算: " . ($x ** $y) . "\n"; // 1000000 ?>
最佳實踐:涉及金額、精度敏感計算務必使用 BCMath 擴展或整數(分)運算;複雜表達式加括號明確優先級;關鍵計算邏輯編寫單元測試覆蓋邊界值。