1. 程式人生 > >PHP強化之09 - 常量

PHP強化之09 - 常量

一、簡介

常量是一個簡單值的識別符號(名字)。如同其名稱所暗示的,在指令碼執行期間該值不能改變

和superglobals(預定義變數)一樣,常量的範圍是全域性的。不用管作用區域就可以在指令碼的任何地方訪問常量。

二、常量的定義

1、define
在執行時定義一個常量:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )

value為常量的值;在 PHP 5 中,value 必須是標量( integer、 float、string、boolean、NULL)在 PHP 7 中還允許是個 array 的值。

define()可以通過第三個引數case_insensitive來指定是否區分大小寫。true表示大小寫不敏感,預設為false。

define() 將常量放入全域性作用域,即使在名稱空間中使用define方法定義常量也屬於全域性作用域的。名稱空間作用域內的常量使用const定義如::namespace j; const ABC='100';

2、const
語法:const CONSTANT = VALUE;

和使用 define() 來定義常量相反的是,使用 const 關鍵字定義常量必須處於最頂端的作用區域,因為用此方法是在編譯時定義的。這就意味著不能在函式內,迴圈內以及 if 語句之內用 const 來定義常量。否則會報語法錯誤。

const可以定義類常量和名稱空間常量。

如下定義方式也是錯誤的:

$a = 123;
const MYCONST = $a;   //Fatal error: Constant expression contains invalid operations  

3、區別

1)const是一個語言結構;而define是一個函式。
2)const簡單易讀,編譯時要比define快很多。
3)const可在類中使用,用於類成員常量定義,定義後不可修改;define不能在類中使用,可用於全域性變數。
4)const是在編譯時定義,因此必須處於最頂端的作用區域,不能在函式,迴圈及if條件中使用;而define是函式,也就是能呼叫函式的地方都可以使用。
5)const只能用普通的常量名,define常量名中可以有表示式。
6)const定義的常量只能是靜態常量,define可以是任意表達式。define所以define更加靈活。
7)define在執行期定義常量,而const在編譯期定義常量。這樣 const 就有輕微的速度優勢(即效能稍微好點),但不值得考慮這個問題,除非你在構建大高併發系統。

4、注意:

1)一個常量一旦被定義,就不能再改變或者取消定義。
2)常量只能包含標量資料(boolean,integer,float 和 string)

5、相關函式:

1)檢查某個名稱的常量是否已定義:
bool defined ( string $name )

2)返回一個常量的值:
mixed constant ( string $name ) //返回常量的值。如果常量未定義則返回 NULL。

3)返回所有常量的關聯陣列:
array get_defined_constants ([ bool $categorize = false ] ) //返回當前所有已定義的常量名和值。
如:

define("CONSTANT", "Hello world.");
const MYCONST = 'Hello World';
var_dump(get_defined_constants(1));

輸出結果如下(省略了大部分系統常量):

array (size=23)
  'Core' => 
    array (size=74)
      'E_ERROR' => int 1
      'E_RECOVERABLE_ERROR' => int 4096
      'E_WARNING' => int 2
      'E_PARSE' => int 4
      'E_NOTICE' => int 8
      ... ...
   ... ...
  'session' => ... ...
  'ftp' => ... ...
  'iconv' => ... ...
  'json' => ... ...
  ... ...
  'xdebug' => 
    array (size=8)
      'XDEBUG_TRACE_APPEND' => int 1
      'XDEBUG_TRACE_COMPUTERIZED' => int 2
      'XDEBUG_TRACE_HTML' => int 4
      'XDEBUG_TRACE_NAKED_FILENAME' => int 8
      'XDEBUG_CC_UNUSED' => int 1
      'XDEBUG_CC_DEAD_CODE' => int 2
      'XDEBUG_CC_BRANCH_CHECK' => int 4
      'XDEBUG_STACK_NO_DESC' => int 1
  'user' => 
    array (size=2)
      'CONSTANT' => string 'Hello world.' (length=12)
      'MYCONST' => string 'Hello World' (length=11)

三、魔術常量

常見的php魔術常量如:
__FILE__、__LINE__、__DIR__、__FUNCTION__、__CLASS__、__TRAIT__、__METHOD__、__NAMESPACE__

名稱 說明
__LINE__ 檔案中的當前行號。
__FILE__ 檔案的完整路徑和檔名。如果用在被包含檔案中,則返回被包含的檔名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑(如果是符號連線,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。
__DIR__ 檔案所在的目錄。如果用在被包括檔案中,則返回被包括的檔案所在的目錄。它等價於 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜槓。(PHP 5.3.0中新增) =
__FUNCTION__ 函式名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函式被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。
__CLASS__ 類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。類名包括其被宣告的作用區域(例如 Foo\Bar)。注意自 PHP 5.4 起__CLASS__ 對 trait 也起作用。當用在 trait 方法中時,__CLASS__ 是呼叫 trait 方法的類的名字。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時的名字(區分大小寫)。Trait 名包括其被宣告的作用區域(例如 Foo\Bar)。
__METHOD__ 類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
__NAMESPACE__ 當前名稱空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。

參考

官方手冊:http://php.net/manual/zh/language.constants.php