首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 表達式完整指南:從基礎語法到進階運算機制

     編輯:PHP 相關知識

什麼是表達式?

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 === $btrue/false用於條件判斷
邏輯運算$a && $b, !$atrue/false短路求值
函數呼叫foo(), strlen($s)回傳值return 的值即表達式值
物件實例化new User()物件實例建構子無回傳值
三元運算子$a ? $b : $c$b 或 $cPHP 7+ ?? 空合併運算子
複合賦值$a += 3, $b .= 'x'運算後的值等同 $a = $a + 3 但更快

關鍵機制深度解析

1. 賦值表達式的值與鏈式賦值

<?php
$a = 5;           // 值為 5
$b = ($a = 5);    // $b = 5, $a = 5
$b = $a = 5;      // 同樣,右結合
echo $a = 3;      // 輸出 3,賦值表達式的值即被賦予的值
?>

2. 前綴 vs 後綴自增自減

<?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
?>

3. 複合賦值運算子完整列表

$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 時賦值

4. 比較運算子與型別轉換陷阱

運算子名稱行為建議
==鬆散相等型別轉換後比較 ('123' == 123 為 true)極少使用,極易出錯
===嚴格相等型別與值皆相同預設首選
!= / <>不相等鬆散比較避免
!==嚴格不相等型別或值不同首選
<=>太空船運算子回傳 -1/0/1 (PHP 7+)排序比較利器

5. 真值判斷規則 (Truthy/Falsy)

條件判斷 (if, while, ?) 時自動轉換為布林:

  • Falsy (視為 false):0, 0.0, '', '0', [], null, false, 空 SimpleXML 物件。
  • Truthy (視為 true):除上述外的所有值,包含 -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) 不是表達式
?>

常見誤區與避坑

  1. 以為 echo 是函數:echo 是語言構造,無回傳值,不能用於表達式位置 ($a = echo 'x' 錯誤)。print 回傳 1,可用於表達式。
  2. 混淆 == 與 ===:永遠優先使用 ===,除非明確需要型別轉換語意。
  3. 字串 '0' 為 false:表單輸入 '0' 會被視為 false,驗證邏輯需用 !== '' 或 isset()。
  4. 後綴自增在複合運算中副作用:$a = 5; $b = $a++ + $a++ 行為難預測,嚴禁這樣寫。
  5. 賦值優先級低於三元運算子:$a = true ? 1 : 2 正常,但 $a = $b = true ? 1 : 2 需加括號明確意圖。

總結

PHP 的表達式導向設計賦予語言極大彈性:賦值有值、函數呼叫有值、比較有值、甚至 include 有值。深入理解值的產生、型別轉換、優先級、短路求值、真值判斷等核心機制,能讓你撰寫出更簡潔、高效、且符合預期的程式碼。建議常備運算子優先級表與真值對照表,遇到疑似優先級問題立即加括號明確意圖。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved