<?php
$a = 'a';
// ❌ 錯誤:賦值表達式結果為 'a' (真值),if 永遠成立
if ($a = 'b') {
echo "這行會執行,且 \$a 被改為 'b'\n";
}
// ✅ 正確:比較
if ($a == 'b') { // 值比較 (類型轉換)
echo "不會執行\n";
}
if ($a === 'a') { // 全等比較 (值+類型)
echo "正確執行\n";
}
?>
後果:邏輯錯誤、變量被意外修改、極難排查 (語法合法、無報錯)。
<?php
$a = 'b';
// ✅ 正確:不等於
if ($a != 'a') {
echo "執行:\$a 不等於 'a'\n"; // 輸出此行
}
// ❌ 錯誤:=! 解析為 = ! (賦值 非 'a')
if ($a =! 'a') {
echo "不會執行\n";
}
var_dump($a); // bool(false) !變量被破壞
// 解析過程:
// $a = !'a' -> 'a' 為真 -> !真 = 假 -> $a = false
// if ($a) -> if (false) -> 不進入
?>
原理:=! 不是運算符,而是 = (賦值) + ! (邏輯非)。!'a' 先計算為 false,再賦值給 $a。
| 代碼 | 含義 | 結果 | 風險 |
|---|---|---|---|
$a = $b | 賦值 | $a 變為 $b 的值 | ⚠ 易誤寫 |
$a == $b | 值相等 (類型轉換) | true/false | ✅ 推薦 |
$a === $b | 全等 (值+類型) | true/false | ✅ 強推薦 |
$a != $b | 值不等 | true/false | ✅ 推薦 |
$a !== $b | 不全等 | true/false | ✅ 強推薦 |
$a =! $b | 賦值 $b 的邏輯非 | $a = !$b | 💀 極高風險 |
$a =!! $b | 賦值 $b 的雙重非 (轉布爾) | $a = (bool)$b | ⚠ 易誤讀 |
if ('expected' === $var)。誤寫成 = 會直接報語法錯誤 (不能賦值給常量)。PHPStan、Psalm、PHP_CodeSniffer 可自動檢測「賦值用於條件判斷」。if (,條件內部不加空格 ===,增強可讀性。0, '', null, false, [] 等假值場景。<?php
// 1. 臨時加入變量輸出
if ($a =! 'a') {
error_log("DEBUG: \$a = " . var_export($a, true)); // 發現 \$a 變 false
}
// 2. 使用 IDE 斷點調試 (PhpStorm/VS Code + Xdebug)
// 3. grep 排查全項目
// 搜索 "=!" " =! " "!= " " = " (注意空格)
// 正則: \b\w+\s*[=!]=?\s*
?>
=== / !== 是默認選擇,Yoda 條件防誤賦值,靜態分析自動攔截。
遇到「邏輯明明正確卻不生效」優先檢查條件判斷是否寫成賦值或=!。