在PHP 編程中,常量是一種在執行期間不能被改變的標識符,常用於配置參數或固定值的聲明。當我們在開發大型應用或調試第三方庫時,有時需要檢測哪些常量在某一段代碼中被定義或修改。這時, get_defined_constants()函數就派上用場了。
get_defined_constants()是PHP 內置函數,它返回當前所有定義過的常量及其對應的值。通過在代碼執行前後調用該函數並進行對比,我們就能精準地捕捉到新增的常量,甚至可以進一步檢查這些常量的值。
array get_defined_constants ([ bool $categorize = false ] )
如果$categorize參數設置為true ,返回的數組會按照常量的分類(如核心、用戶自定義等)分組;
否則,返回一個扁平的一維關聯數組,鍵是常量名,值是常量的值。
我們可以通過在某段代碼前後各調用一次get_defined_constants() ,然後對比兩個數組之間的差異,從而獲取中間代碼中新增的常量。
以下是一個完整的示例:
<?php
// 記錄初始常量狀態
$before = get_defined_constants();
// 模擬加載第三方配置文件或庫
include 'http://m66.net/sample-config.php'; // 示例 URL
// 記錄加載後的常量狀態
$after = get_defined_constants();
// 計算新增的常量
$new_constants = array_diff_assoc($after, $before);
// 輸出新增常量
echo "新增的常量如下:\n";
foreach ($new_constants as $name => $value) {
echo "$name => " . var_export($value, true) . "\n";
}
在這個例子中,我們使用了array_diff_assoc()來比較兩個數組的差異,它不僅比較鍵名,還比較鍵值。這樣可以準確地獲得那些全新定義的常量,而不是值被更改的已有常量。
如果只想獲取用戶自定義的常量,可以在調用get_defined_constants(true)時加入分類參數,並從中提取"user"類別下的常量。例如:
$before = get_defined_constants(true)['user'] ?? [];
include 'http://m66.net/sample-config.php';
$after = get_defined_constants(true)['user'] ?? [];
$new_constants = array_diff_assoc($after, $before);
foreach ($new_constants as $name => $value) {
echo "$name => " . var_export($value, true) . "\n";
}
這種方式尤其適合需要排除系統默認常量的場景,能更專注地捕捉用戶或業務邏輯中新增的定義。
調試第三方庫:分析某個庫或框架引入了哪些常量;
配置追踪:定位在多個配置文件中定義的重複或衝突常量;
安全審計:監測是否有異常常量被惡意注入;
測試與驗證:自動測試流程中對比前後狀態差異。
常量一旦定義不能被修改,重複定義會導致警告;
建議使用命名空間前綴來避免命名衝突;
避免在核心邏輯中動態生成大量常量,否則會影響代碼的可維護性;