在 PHP 開發中,初學者常遇到這樣的情況:代碼明明能輸出結果,卻同時拋出 Notice: Use of undefined constant PI - assumed 'PI' 提示。這其實不是嚴重錯誤,只是 PHP 的「注意」級別提示,但若不處理,會影響代碼規範與除錯效率。
<?php
define(PI, 3.14);
for ($r = 1; $r <= 8; $r++) {
$area = PI * $r * $r;
echo "r=$r, area=$area";
echo "<br/>";
}
?>
核心問題在於 define() 函數的第一個參數未加引號。 PHP 手冊定義:bool define(string $name, mixed $value, bool $case_insensitive = false)。第一個參數 必須是字符串,即常量名稱需用單引號或雙引號包裹。
define(PI, 3.14); → PHP 會嘗試尋找常量 PI 的值作為常量名,找不到時發出 Notice,並假定為字符串 'PI'。define('PI', 3.14); 或 define("PI", 3.14);引號是給 常量名稱(第一個參數) 加的,而非值。define('PI', 3.14) 中,'PI' 是字符串常量名,3.14 是數值,類型自動推斷。
PHP 雖是弱類型,但語法規則仍需遵守。define(PI, 3.14) 在舊版本可能因歷史兼容性勉強運行,但現代 PHP(7.0+)已棄用此行為,未來版本將拋出 Error。
<?php
define('DA', '123');
define('DB', '123');
define('DC', 123);
echo gettype(DA) . '<br>'; // string
echo gettype(DB) . '<br>'; // string
echo gettype(DC) . '<br>'; // integer
?>
第三種寫法最嚴謹,常量值類型由值本身決定,不受引號影響。
<?php
define('PI', 3.14); // 加上單引號
for ($r = 1; $r <= 8; $r++) {
$area = PI * $r * $r;
echo "r=$r, area=$area<br/>";
}
?>
<?php
error_reporting(E_ALL ^ E_NOTICE); // 僅隱藏提示,未修復根本問題
define(PI, 3.14);
// ... 其餘代碼
?>
define('CONST_NAME', value))。const 關鍵字(PHP 5.3+): const PI = 3.14; 語法更簡潔,編譯時解析,效能略優。error_reporting(E_ALL);,及時發現潛在問題。Notice: Use of undefined constant 看似無害,實則揭示語法不規範。修正 define() 第一參數加引號,不僅消除提示,更符合 PHP 語言規範,避免未來版本兼容性風險。作為開發者,應追求「零 Notice」的代碼質量。