一碴巾、簡介
常量是一個簡單值的標(biāo)識符(名字)。如同其名稱所暗示的捶朵,在腳本執(zhí)行期間該值不能改變
和superglobals(預(yù)定義變量)一樣贤壁,常量的范圍是全局的悼枢。不用管作用區(qū)域就可以在腳本的任何地方訪問常量。
二脾拆、常量的定義
1馒索、define
在運行時定義一個常量:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
value為常量的值;在 PHP 5 中名船,value 必須是標(biāo)量( integer绰上、 float、string渠驼、boolean蜈块、NULL)在 PHP 7 中還允許是個 array 的值。
define()可以通過第三個參數(shù)case_insensitive來指定是否區(qū)分大小寫迷扇。true表示大小寫不敏感百揭,默認(rèn)為false。
define() 將常量放入全局作用域谋梭,即使在命名空間中使用define方法定義常量也屬于全局作用域的信峻。命名空間作用域內(nèi)的常量使用const定義如::namespace j; const ABC='100';
。
2瓮床、const
語法:const CONSTANT = VALUE;
和使用 define() 來定義常量相反的是,使用 const 關(guān)鍵字定義常量必須處于最頂端的作用區(qū)域产镐,因為用此方法是在編譯時定義的隘庄。這就意味著不能在函數(shù)內(nèi),循環(huán)內(nèi)以及 if 語句之內(nèi)用 const 來定義常量癣亚。否則會報語法錯誤丑掺。
const可以定義類常量和命名空間常量。
如下定義方式也是錯誤的:
$a = 123;
const MYCONST = $a; //Fatal error: Constant expression contains invalid operations
3述雾、區(qū)別
1)const是一個語言結(jié)構(gòu)街州;而define是一個函數(shù)兼丰。
2)const簡單易讀,編譯時要比define快很多唆缴。
3)const可在類中使用鳍征,用于類成員常量定義,定義后不可修改面徽;define不能在類中使用艳丛,可用于全局變量。
4)const是在編譯時定義趟紊,因此必須處于最頂端的作用區(qū)域氮双,不能在函數(shù),循環(huán)及if條件中使用霎匈;而define是函數(shù)戴差,也就是能調(diào)用函數(shù)的地方都可以使用。
5)const只能用普通的常量名铛嘱,define常量名中可以有表達(dá)式造挽。
6)const定義的常量只能是靜態(tài)常量,define可以是任意表達(dá)式弄痹。define所以define更加靈活饭入。
7)define在執(zhí)行期定義常量,而const在編譯期定義常量肛真。這樣 const 就有輕微的速度優(yōu)勢(即性能稍微好點)谐丢,但不值得考慮這個問題,除非你在構(gòu)建大高并發(fā)系統(tǒng)蚓让。
4乾忱、注意:
1)一個常量一旦被定義,就不能再改變或者取消定義历极。
2)常量只能包含標(biāo)量數(shù)據(jù)(boolean窄瘟,integer,float 和 string)
5趟卸、相關(guān)函數(shù):
1)檢查某個名稱的常量是否已定義:
bool defined ( string $name )
2)返回一個常量的值:
mixed constant ( string $name )
//返回常量的值蹄葱。如果常量未定義則返回 NULL。
3)返回所有常量的關(guān)聯(lián)數(shù)組:
array get_defined_constants ([ bool $categorize = false ] )
//返回當(dāng)前所有已定義的常量名和值锄列。
如:
define("CONSTANT", "Hello world.");
const MYCONST = 'Hello World';
var_dump(get_defined_constants(1));
輸出結(jié)果如下(省略了大部分系統(tǒng)常量):
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)
三图云、魔術(shù)常量
常見的php魔術(shù)常量如:
__FILE__、__LINE__邻邮、__DIR__竣况、__FUNCTION__、__CLASS__筒严、__TRAIT__丹泉、__METHOD__情萤、__NAMESPACE__
名稱 | 說明 |
---|---|
__LINE__ | 文件中的當(dāng)前行號。 |
__FILE__ | 文件的完整路徑和文件名摹恨。如果用在被包含文件中筋岛,則返回被包含的文件名。自 PHP 4.0.2 起睬塌,__FILE__ 總是包含一個絕對路徑(如果是符號連接泉蝌,則是解析后的絕對路徑),而在此之前的版本有時會包含一個相對路徑揩晴。 |
__DIR__ | 文件所在的目錄勋陪。如果用在被包括文件中,則返回被包括的文件所在的目錄硫兰。它等價于 dirname(__FILE__)诅愚。除非是根目錄,否則目錄中名不包括末尾的斜杠劫映。(PHP 5.3.0中新增) = |
__FUNCTION__ | 函數(shù)名稱(PHP 4.3.0 新加)违孝。自 PHP 5 起本常量返回該函數(shù)被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的泳赋。 |
__CLASS__ | 類的名稱(PHP 4.3.0 新加)雌桑。自 PHP 5 起本常量返回該類被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的祖今。類名包括其被聲明的作用區(qū)域(例如 Foo\Bar)校坑。注意自 PHP 5.4 起__CLASS__ 對 trait 也起作用。當(dāng)用在 trait 方法中時千诬,__CLASS__ 是調(diào)用 trait 方法的類的名字耍目。 |
__TRAIT__ | Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時的名字(區(qū)分大小寫)徐绑。Trait 名包括其被聲明的作用區(qū)域(例如 Foo\Bar)邪驮。 |
__METHOD__ | 類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區(qū)分大小寫)傲茄。 |
__NAMESPACE__ | 當(dāng)前命名空間的名稱(區(qū)分大小寫)毅访。此常量是在編譯時定義的(PHP 5.3.0 新增)。 |