當前位置: 首頁> 最新文章列表> get_defined_constants() 在不同PHP 版本下的差異

get_defined_constants() 在不同PHP 版本下的差異

M66 2025-05-22

get_defined_constants()是PHP 中用於獲取所有已定義常量的內置函數。它返回一個關聯數組,其中鍵為常量名,值為常量值。這在調試、反射或分析運行環境時非常有用。然而,在不同版本的PHP 中,該函數的行為可能會表現出一些差異,主要體現在以下幾個方面:

1. 常量的數量和種類發生變化

隨著PHP 的發展,不斷有新的核心常量被引入,尤其是在新增擴展或對現有模塊進行重構後。例如,在PHP 7.x 和PHP 8.x 中,錯誤處理機制的變化導致引入了大量新的E_*錯誤級別常量。

示例:

 print_r(array_keys(get_defined_constants()));

在PHP 5.6 中,你可能看不到E_ERROR | E_RECOVERABLE_ERROR這樣的合併常量,但到了PHP 7 以後,就會多出很多這類組合值的定義。

2. 分類參數的行為變化( get_defined_constants(true)

從PHP 5.3 起, get_defined_constants()開始支持一個布爾參數$categorize ,當設為true時,會以擴展名分類常量。

示例:

 print_r(get_defined_constants(true));

不同PHP 版本中,不同擴展模塊的分類名可能會變。例如:

  • PHP 7.2 中的數組可能包含Core , pcre , SPL , date , libxml , openssl , curl等。

  • PHP 8.0 後引入的如ffi , sodium , fiber ,也會新增到輸出結果中。

3. 編譯和運行環境的差異

某些常量是否出現在get_defined_constants()的結果中,可能受到配置文件(如php.ini )或編譯選項的影響。例如是否啟用了Zend OPcache ,是否加載了特定擴展模塊等。

示例代碼(在CLI 中運行):

 define('MY_APP_VERSION', '1.0.0');
print_r(get_defined_constants());

這個輸出在開發服務器與生產服務器之間常常不一致,因為它們啟用的擴展和配置參數可能不同。

4. 新引入的語言結構和內建常量

PHP 8 引入了JIT、match 表達式、屬性(attributes)等語法特性,也相應帶來了新常量。運行get_defined_constants()會發現如PHP_FD_SETSIZET_MATCHT_ATTRIBUTE等常量的出現。

這些新常量在舊版本中完全不存在,因此如果你在寫兼容性強的代碼時依賴這些常量,一定要使用defined()函數加以判斷。

5. 常量值的改變或刪除

極少數情況下,某些已定義常量在新版本中會被更改或廢棄。雖然PHP 團隊通常會確保向後兼容,但也不排除在重大版本升級時進行調整。例如一些與底層系統交互的擴展,因依賴C 庫的更新,可能會改變默認值或刪除某些不再支持的常量。