1. 程式人生 > >PHP中const和define()定義常量的細節區別

PHP中const和define()定義常量的細節區別

眾所周知,在PHP中(PHP 4及以後),我們可以使用函式define()來定義常量,例如:

  1. <?php
  2. define('PI',3.14159);//定義一個名為PI的常量
  3. echo PI;//輸出:3.14159
  4. ?>

不過,在PHP 5.3.0之後,除了使用函式define()之外,我們還可以使用PHP關鍵字const來定義常量。

例如:

  1. <?php
  2. //以下程式碼需在PHP 5.3.0及之後的版本中執行
  3. const PI =3.14159;//使用const關鍵字定義一個名為PI的常量
  4. echo PI;//輸出:3.14159
  5. ?>

雖然上述兩種方式均可以定義常量,但是它們之間有什麼不同之處呢。下面我們來一一講解PHP中define()

函式和const關鍵字定義常量的區別:

1.版本差異首先,毫無疑問的是,兩種定義常量的方式之間存在版本差異,函式define()在PHP4和PHP5中均可使用,關鍵字const只能在PHP 5.3.0及其後的版本中使用。

2.定義位置的區別由於函式define()定義的常量是在執行define()函式時定義的,因此可以在函式內、迴圈內、if語句內等函式能夠被呼叫的任何地方使用define()函式定義常量。與define()不同的是,由於const關鍵字定義的常量是在編譯時定義的,因此const關鍵字定義常量必須處於最頂端的作用區域。這也就意味著不能在函式內、迴圈內以及if語句之內用const

來定義常量。

  1. <?php
  2. //使用const關鍵字定義常量必須處於最頂端的作用區域
  3. //也就是可以在編譯時直接解析定義的地方
  4. const DEMO ='DEMO';
  5. classPerson{
  6. const MAN ='男';
  7. const WOMAN ='女';
  8. }
  9. interface USB{
  10. const VERSION_2 ='2.0';
  11. const VERSION_3 ='3.0';
  12. }
  13. ?>

3.對值的表示式支援的差異雖然關鍵字constdefine()定義的常量值都只能為null或標量資料(booleanintegerfloatstring型別)以及resource型別(不推薦定義resource

型別的常量,否則可能出現無法預知的結果)。不過,由於關鍵字const定義常量是在編譯時定義的,因此const關鍵字定義的常量值的表示式中不支援算術運算子、位運算子、比較運算子等多種運算子,而這些運算子在define()函式定義常量時都是可以直接使用的。

  1. <?php
  2. define('DEFINE_VAR1',1<<1);
  3. //const CONST_VAR1 = (1 << 1); //const不支援位運算子,PHP會報語法錯誤
  4. define('DEFINE_VAR2',1+1);
  5. //const CONST_VAR2 = 1 + 1 ; //const不支援算術運算子,PHP會報語法錯誤
  6. define('DEFINE_VAR3',1==1);
  7. //const CONST_VAR3 = 1 == 1 ; //const不支援比較運算子,PHP會報語法錯誤
  8. $value =3;
  9. define('DEFINE_VAR4', $value);
  10. //const CONST_VAR4 = $value ; //const不支援變數形式的值,PHP會報語法錯誤
  11. define('DEFINE_VAR5',true||false);
  12. //const CONST_VAR5 = true || false ; //const不支援邏輯運算子,PHP會報語法錯誤
  13. define('DEFINE_VAR6','Hello'.' World!');
  14. //const CONST_VAR6 = 'Hello'.' World!' ; //const不支援字串運算子,PHP會報語法錯誤
  15. classUser{
  16. }$user =newUser();define('DEFINE_VAR7', $user instanceofUser);
  17. //const CONST_VAR7 = $user instanceof User ; //const不支援型別運算子,PHP會報語法錯誤
  18. ?>

4.對字元大小寫敏感的支援差異除上述3個區別外,還有一個不太起眼的區別。函式define()可以接收第3個引數,如果該引數為true,則表示常量名的大小寫不敏感。而使用const關鍵字定義常量卻沒有提供類似的功能。

  1. <?php
  2. //設定編碼為UTF-8,以避免中文亂碼
  3. header('Content-Type:text/html;charset=utf-8');
  4. //define()的第3個引數為true時,表示大小寫不敏感
  5. define('SITE_NAME','CodePlayer',true);
  6. echo SITE_NAME;//輸出:CodePlayer
  7. echo site_name;//輸出:CodePlayer
  8. echo SiTe_NamE;//輸出:CodePlayer
  9. const DOMAIN_NAME ='365mini.com';
  10. echo DOMAIN_NAME;//輸出:365mini.com
  11. echo domain_name;//PHP提示常量未定義
  12. echo DomaIN_nAMe;//PHP提示常量未定義
  13. ?>