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

PHP 判斷變量是否為零/空的正確姿勢:避開類型轉換陷阱

     編輯:PHP 綜合知識

核心問題:PHP 鬆散比較的「零值陷阱」

<?php
$val = '0'; // 字符串零
var_dump($val == 0);        // true  😱
var_dump($val == '');       // false
var_dump($val === 0);       // false (類型不同)
var_dump(empty($val));      // false 😱 字符串 '0' 不視為 empty!
var_dump($val == null);     // true  😱
var_dump(is_numeric($val)); // true
?>

判斷策略決策表

業務語義推薦寫法說明
「未提交/未設置」!isset($_POST['key'])區分「未傳」與「傳了空值」
「提交了但為空字符串」isset($_POST['key']) && $_POST['key'] === ''精確匹配空串
「提交了非空字符串」isset($_POST['key']) && $_POST['key'] !== ''最常用驗證
「數值為 0(含字符串 '0')」$val == 0 或 (string)$val === '0'業務允許 0 時
「數值非零」$val != 0 或 (string)$val !== '0'注意 '0.0' != 0 為 false
「一般性空值檢查」empty($val)包含:null, '', 0, '0', false, [], 未定義 — 慎用
「嚴格非空字符串」is_string($val) && $val !== ''排除數字 0、布爾 false

表單驗證最佳實踐

<?php
function validateRequired(array $data, array $requiredFields): array {
    $errors = [];
    foreach ($requiredFields as $field) {
        // 1. 檢查是否提交
        if (!array_key_exists($field, $data)) {
            $errors[$field] = '字段缺失';
            continue;
        }
        $val = $data[$field];

        // 2. 字符串類型非空檢查(允許 '0'、'false' 等業務有效值)
        if (is_string($val) && $val === '') {
            $errors[$field] = '不能為空';
        }
        // 3. 陣列類型非空(如多選框)
        elseif (is_array($val) && empty($val)) {
            $errors[$field] = '至少選擇一項';
        }
        // 4. 數值類型(可選:排除 0)
        // elseif (is_numeric($val) && $val == 0) { ... }
    }
    return $errors;
}

// 使用
$errors = validateRequired($_POST, ['username', 'age', 'hobbies']);
if ($errors) {
    // 返回錯誤
}
?>

數據庫布爾/狀態字段處理

<?php
// 資料庫 tinyint(1) 狀態:0=禁用, 1=啟用
$status = $_POST['status'] ?? '';

// ✅ 正確:明確允許 '0' 字符串
if ($status === '0' || $status === '1') {
    $stmt->execute([$status]);
}

// ❌ 錯誤:empty('0') 為 true,會誤判為未提交
// if (!empty($status)) { ... }
?>

總結:三句口訣

  1. 先 isset/array_key_exists 區分「有無」
  2. 再 ===/!== 區分「值與類型」
  3. 慎用 empty/==,業務允許 0 時必須顯式處理

記住:'0' 在 PHP 中是「非空字符串」但「數值為零」,empty() 視其為空,== 0 視其為零——根據業務語義選擇比較方式,而非習慣。

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