開發中頻繁需要檢查符號是否存在,PHP 提供四種核心函數分別對應常數、變數、函數、輸入變數。本文整理語法、陷阱與最佳實踐。
檢查常數是否已定義,參數必須加引號(單雙引號皆可)。
<?php
if (defined('CONST_NAME')) {
// 常數存在
echo CONST_NAME;
}
?>
陷阱:defined('MY_CONST') 正確,defined(MY_CONST) 會先嘗試解析常數值,未定義時拋出 Notice 並將字串 "MY_CONST" 當作常數名,導致誤判。
判斷變數是否宣告且不為 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']) 同理。
檢查函數是否已定義(內建或使用者定義),函數名需加引號。
<?php
if (function_exists('json_encode')) {
$json = json_encode($data);
} else {
// 降級處理
}
?>
注意:function_exists 不區分大小寫。若需檢查類方法,請用 method_exists($obj, 'method') 或 is_callable()。
專門檢查特定輸入來源 (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() 檢查變數/陣列鍵,效能最好。array_key_exists() (陣列) 或 get_defined_vars() (區域變數)。method_exists(),檢查可呼叫實體用 is_callable()。filter_input() 系列,整合存在性檢查與過濾。