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

PHP 判斷常數、變數、函數與輸入變數是否存在的完整指南

     編輯:PHP 相關知識

開發中頻繁需要檢查符號是否存在,PHP 提供四種核心函數分別對應常數、變數、函數、輸入變數。本文整理語法、陷阱與最佳實踐。

1. 常數檢測:defined()

檢查常數是否已定義,參數必須加引號(單雙引號皆可)。

<?php
if (defined('CONST_NAME')) {
    // 常數存在
    echo CONST_NAME;
}
?>

陷阱:defined('MY_CONST') 正確,defined(MY_CONST) 會先嘗試解析常數值,未定義時拋出 Notice 並將字串 "MY_CONST" 當作常數名,導致誤判。

2. 變數檢測:isset()

判斷變數是否宣告且不為 NULL。未宣告或值為 NULL 均回傳 false。

<?php
$var = 'hello';
unset($var);
var_dump(isset($var)); // false

$var = null;
var_dump(isset($var)); // false
?>

進階:可一次檢查多個變數 isset($a, $b, $c),全存在才回傳 true。檢查陣列鍵 isset($arr['key']) 同理。

3. 函數檢測:function_exists()

檢查函數是否已定義(內建或使用者定義),函數名需加引號。

<?php
if (function_exists('json_encode')) {
    $json = json_encode($data);
} else {
    // 降級處理
}
?>

注意:function_exists 不區分大小寫。若需檢查類方法,請用 method_exists($obj, 'method') 或 is_callable()。

4. 輸入變數檢測:filter_has_var()

專門檢查特定輸入來源 (GET、POST、COOKIE、SERVER、ENV) 是否存在指定變數,不檢查值是否為空。

<?php
// 檢查 $_GET['name'] 是否存在
if (filter_has_var(INPUT_GET, 'name')) {
    $name = $_GET['name'];
}

// 來源常數:INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
?>

回傳 true/false。配合 filter_input() 可同時驗證/過濾。

綜合範例

<?php
// 常數
defined('APP_VERSION') or define('APP_VERSION', '1.0.0');

// 變數
$username = isset($_POST['username']) ? $_POST['username'] : 'guest';

// 函數
if (function_exists('mb_strlen')) {
    $len = mb_strlen($str, 'UTF-8');
} else {
    $len = strlen($str);
}

// 輸入變數
if (filter_has_var(INPUT_GET, 'api_key')) {
    $key = filter_input(INPUT_GET, 'api_key', FILTER_SANITIZE_STRING);
}
?>

快速對照表

檢查目標函數參數需引號回傳 false 情況
常數defined()是未定義
變數isset()否 (直接寫變數)未宣告或值為 NULL
函數function_exists()是未定義
輸入變數filter_has_var()是 (變數名)該來源無此變數

最佳實踐建議

  • 優先使用 isset() 檢查變數/陣列鍵,效能最好。
  • 需區分「未設定」與「設為 NULL」時,改用 array_key_exists() (陣列) 或 get_defined_vars() (區域變數)。
  • 檢查類方法存在用 method_exists(),檢查可呼叫實體用 is_callable()。
  • 處理外部輸入建議直接用 filter_input() 系列,整合存在性檢查與過濾。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved