在PHP中能够经过define()和const两种方式定义常量
但是在开发中咱们应该何时用define()定义常量,何时用const定义常量? 这两种方式定义常量的主要区别是什么?php
从5.3版本开始PHP有两种方法来定义常量,使用const
关键字或者是使用define()
方法:数组
const FOO = 'BAR'; define('FOO', 'BAR');
二者之间最大的区别在于const
是在编译时定义常量,而define()
方法是在运行时定义常量。ide
const
不能用在if语句中, defne()
能用在if语句中。函数
if(...) { const FOO = 'BAR';//错误 } if(...) { define('FOO', 'BAR');//正确 }
define()
的一个经常使用场景是先判断常量是否已经定义再定义常量:spa
if(defined('FOO)) { define('FOO', 'BAR') }
const
定义常量时,值只能是静态标量(数字, 字符串, true
,false
, null
), 而define()
方法能够把任意表达式的值用做常量的值。从PHP5.6开始const
也容许把表达式用做常量的值了。.net
const BIT_5 = 1 << 5; //PHP5.6后支持,以前的PHP版本不支持 define('BIT_5', 1 << 5);// 全部PHP版本都支持
const
只容许简单的常量名,而define()
能够把任何表达式的值用做常量名code
for ($i = 0; $i < 32; $i++) { define('BIT_' . $i, 1 << $i); }
const
定义的常量常量名是大小写敏感的,而传递true
给define()
方法的第三个参数时能够定义大小写不敏感的常量。接口
define('FOO', 'BAR', true); echo FOO; //BAR echo foo; //BAR
上面列举的都是const
相较define()
而言的一些缺点或者不灵活的地方,下面咱们看一下为何我我的推荐用const
而不是define()
来定义常量(除非要在上述列举的场景中定义常量)。开发
const
具备更好的可读性,const
是语言结构而不是函数,并且与在类中定义类常量的形式保持一致。字符串
const
在当前的命名空间中定义常量, 而define()
要实现相似效果必须在定义时传递完整的命名空间名称:
namespace A\B\C; //To define the constant A\B\C\FOO: const FOO = 'BAR'; define('A\B\C\FOO', 'BAR');
const
从PHP5.6版本开始能够把数组用做常量值,而define()
在PHP7.0版本开始才支持把数组用做常量值。
const FOO = [1, 2, 3];// valid in PHP 5.6 define('FOO', [1, 2, 3]);// invalid in PHP 5.6, valid in PHP 7.0
由于const
是语言结构而且在编译时定义常量因此const
会比define()
稍稍快一些。
众所周知PHP在用define()
定义了大量的常量后会影响效率。 人们设置发明了apc_load_constants()和hidef来绕过define()
致使的效率问题。
最后,const
还能被用于在类和接口中定义常量,define()
只能被用于在全局命名空间中定义常量:
class FOO { const BAR = 2;// 正确 } class Baz { define('QUX', 2)// 错误 }
总结:
除非要在if分支里定义常量或者是经过表达式的值来命名常量, 其余状况(即便是只是简单的为了代码的可读性)都推荐用const
替代define()
。