PHP 中幾乎所有程式碼片段都是表達式。表達式的核心定義:「任何有值的東西」。理解表達式是掌握 PHP 語法靈活性、撰寫簡潔程式碼的關鍵。
| 類別 | 範例 | 值 | 說明 |
|---|---|---|---|
| 字面常值 | 42, 3.14, 'hello', true | 本身 | 最基本表達式 |
| 變數 | $a, $user->name, $arr[0] | 變數當前值 | 左值 可出現在賦值左側 |
| 賦值運算 | $a = 5, $b = $a = 5 | 被賦予的值 (5) | 右結合,鏈式賦值可行 |
| 算術運算 | $a + 3, $a++, ++$a | 運算結果 | 前綴/後綴自增自減值不同 |
| 比較運算 | $a > $b, $a === $b | true/false | 用於條件判斷 |
| 邏輯運算 | $a && $b, !$a | true/false | 短路求值 |
| 函數呼叫 | foo(), strlen($s) | 回傳值 | return 的值即表達式值 |
| 物件實例化 | new User() | 物件實例 | 建構子無回傳值 |
| 三元運算子 | $a ? $b : $c | $b 或 $c | PHP 7+ ?? 空合併運算子 |
| 複合賦值 | $a += 3, $b .= 'x' | 運算後的值 | 等同 $a = $a + 3 但更快 |
<?php
$a = 5; // 值為 5
$b = ($a = 5); // $b = 5, $a = 5
$b = $a = 5; // 同樣,右結合
echo $a = 3; // 輸出 3,賦值表達式的值即被賦予的值
?>
<?php
$a = 5;
echo ++$a; // 6 (先增後取值)
echo $a++; // 6 (先取值後增,輸出原值)
echo $a; // 7
$b = 5;
$c = ++$b; // $c=6, $b=6
$d = $b++; // $d=6, $b=7
?>
$a += 3; // $a = $a + 3
$a -= 5; // $a = $a - 5
$a *= 7; // $a = $a * 7
$a /= 2; // $a = $a / 2
$a %= 3; // $a = $a % 3
$a **= 2; // $a = $a ** 2 (冪次,PHP 5.6+)
$a .= 'x'; // $a = $a . 'x' (字串串接)
$a &= 0xF; // 位元 AND
$a |= 0xF; // 位元 OR
$a ^= 0xF; // 位元 XOR
$a <<= 2; // 左移
$a >>= 2; // 右移
$a ??= 'default'; // 空合併賦值 (PHP 7.4+),僅當 $a 為 null 時賦值
| 運算子 | 名稱 | 行為 | 建議 |
|---|---|---|---|
== | 鬆散相等 | 型別轉換後比較 ('123' == 123 為 true) | 極少使用,極易出錯 |
=== | 嚴格相等 | 型別與值皆相同 | 預設首選 |
!= / <> | 不相等 | 鬆散比較 | 避免 |
!== | 嚴格不相等 | 型別或值不同 | 首選 |
<=> | 太空船運算子 | 回傳 -1/0/1 (PHP 7+) | 排序比較利器 |
條件判斷 (if, while, ?) 時自動轉換為布林:
0, 0.0, '', '0', [], null, false, 空 SimpleXML 物件。-1, '00', 'false', [0], new stdClass()。<?php
var_dump((bool) '0'); // false (字串 '0' 視為 false!)
var_dump((bool) '00'); // true
var_dump((bool) -1); // true
var_dump((bool) []); // false
var_dump((bool) [0]); // true (非空陣列)
?>
<?php
// 舊寫法
$name = isset($user['name']) ? $user['name'] : 'Guest';
// PHP 7+ 空合併運算子
$name = $user['name'] ?? 'Guest';
// PHP 7.4+ 空合併賦值
$user['name'] ??= 'Guest';
// 邏輯短路執行副作用
$cache->get($key) ?? $cache->set($key, computeExpensiveValue());
?>
<?php
// 任何表達式加分號即成語句
foo(); // 函數呼叫語句
$a = 5; // 賦值語句
$a++; // 自增語句
// 但宣告語句 (class, function, const) 不是表達式
?>
echo 是函數:echo 是語言構造,無回傳值,不能用於表達式位置 ($a = echo 'x' 錯誤)。print 回傳 1,可用於表達式。== 與 ===:永遠優先使用 ===,除非明確需要型別轉換語意。'0' 為 false:表單輸入 '0' 會被視為 false,驗證邏輯需用 !== '' 或 isset()。$a = 5; $b = $a++ + $a++ 行為難預測,嚴禁這樣寫。$a = true ? 1 : 2 正常,但 $a = $b = true ? 1 : 2 需加括號明確意圖。PHP 的表達式導向設計賦予語言極大彈性:賦值有值、函數呼叫有值、比較有值、甚至 include 有值。深入理解值的產生、型別轉換、優先級、短路求值、真值判斷等核心機制,能讓你撰寫出更簡潔、高效、且符合預期的程式碼。建議常備運算子優先級表與真值對照表,遇到疑似優先級問題立即加括號明確意圖。