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

PHP 判斷變數是否為 0 或空值:嚴格比較與類型陷阱

     編輯:PHP 相關知識

前言

PHP 是弱型別語言,0、'0'、''、null、false、[] 在鬆散比較 (==) 下均為 true,導致判斷「是否為 0」極易出錯。本文梳理各種判斷場景、正確寫法與常見陷阱。

核心比較表

值== 0=== 0is_int()empty()isset()strlen()
0 (int)truetruetruetruetrue1
'0' (string)truefalsefalsetruetrue1
'' (空字串)truefalsefalsetruetrue0
nulltruefalsefalsetruefalseWarning
falsetruefalsefalsetruetrueWarning
[] (空陣列)falsefalsefalsetruetrueWarning

常見判斷場景與正確寫法

1. 判斷「整數變數值是否為 0」

<?php
$val = 0; // 來自資料庫、API、表單

// ✅ 推薦:嚴格比較 + 類型檢查
if (is_int($val) && $val === 0) {
    echo "整數 0";
}

// ✅ 只要數值為 0(含 '0'、0.0)
if ((int)$val === 0) { ... }

// ❌ 錯誤:$val == 0 會誤判 null、false、'' 為 0
// ❌ 錯誤:empty($val) 會誤判 '0'、0.0、false 為空
?>

2. 判斷「字串是否為 '0'」

<?php
$str = '0';

// ✅ 嚴格比較
if ($str === '0') { ... }

// ✅ 正則/長度
if (strlen($str) === 1 && $str[0] === '0') { ... }
?>

3. 判斷「變數是否存在且非空」

<?php
// 表單提交 $_POST['age'] 可能為 '0'、''、未設定

// ✅ 存在且非空字串('0' 視為非空)
if (isset($_POST['age']) && $_POST['age'] !== '') { ... }

// ✅ 存在且非 null('0'、0、false 皆通過)
if (isset($_POST['age']) && $_POST['age'] !== null) { ... }

// ❌ empty($_POST['age']) 會將 '0' 視為空 → 錯誤拒絕合法輸入
?>

4. 判斷「數值型欄位是否為零值」

<?php
// 資料庫 numeric/decimal 欄位可能回傳 '0.00'、'0'

// ✅ 強制轉型後嚴格比較
if ((float)$row['amount'] === 0.0) { ... }

// ✅ 使用 bcmath 高精度比較(金融場景)
if (bccomp($row['amount'], '0', 2) === 0) { ... }
?>

最佳實踐原則

  1. 預設使用嚴格比較 (===, !==),除非明確需要類型轉換語意。
  2. 輸入驗證階段 即確立型別:$age = (int)($_POST['age'] ?? 0); 後續邏輯只處理 int。
  3. 避免 empty() 判斷數值輸入,它將 '0'、0、0.0、false 視為空。
  4. 資料庫層面 定義 NOT NULL DEFAULT 0,減少 null 干擾。
  5. 單元測試覆蓋邊界值:0, '0', 0.0, -0, null, false, '', []。

封裝工具函數

<?php
/**
 * 判斷是否為整數零值
 */
function isIntZero(mixed $val): bool {
    return is_int($val) && $val === 0;
}

/**
 * 判斷是否為數值零值 (int/float/string numeric)
 */
function isNumericZero(mixed $val): bool {
    if (is_numeric($val)) {
        return (float)$val === 0.0;
    }
    return false;
}

/**
 * 判斷變數是否「已設定且非空字串」('0' 視為有效)
 */
function isFilledString(mixed $val): bool {
    return is_string($val) && $val !== '';
}

// 使用
var_dump(isIntZero(0));        // true
var_dump(isIntZero('0'));      // false
var_dump(isNumericZero('0.00')); // true
var_dump(isFilledString('0')); // true
var_dump(isFilledString(''));  // false
?>

總結

PHP 判斷「是否為 0」的關鍵在於明確業務語意:是判斷整數型別的 0、數值上的零、還是字串 '0'。堅持「輸入端強型別轉換 + 邏輯層嚴格比較 + 封裝語意化函數」,即可避開弱型別陷阱,寫出可靠、可維護的代碼。

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