当前位置: 首页 > 后端技术 > PHP

PHP中定义常量的区别,define()vs.const

时间:2023-03-29 14:31:26 PHP

前言今天在Stackoverflow上看到另外一篇很有意思的文章,所以翻译后捡起来。文章由PHP开发成员之一NikiC撰写,权威性毋庸置疑。在PHP5.3中,定义常量有两种方式:使用const关键字和使用define()方法constFOO='BAR';define('FOO','BAR');这两种方法的根本区别在于,const在代码编译时定义了一个常量,而define在代码运行时定义了一个常量。这使得const有以下缺点:const不能用于条件语句。如果要定义一个全局变量,const必须在整个代码的最外层:if(...){constFOO='BAR';//无效}//butif(...){define('FOO','BAR');//Valid}你可能会问我为什么要这样做?最常见的示例之一是当您检查常量是否已定义时:if(!defined('FOO')){define('FOO','BAR');}const只能用于声明变量(例如数字、字符串或true、false、null、_FILE_),define()也可以接受表达式。不过在PHP5.6之后,const也可以接受常量表达式:constBIT_5=1<<5;//PHP5.6之后有效,define('BIT_5',1<<5)之前无效;//always一个有效的const常量只能以纯文本命名,而define()允许你用任何表达式命名一个常量。这样我们可以执行以下操作:for($i=0;$i<32;++$i){define('BIT_'.$i,1<<$i);}const定义的常量是区分大小写的,但是define允许您将它的第三个参数设置为true以关闭它的大小写敏感度:define('FOO','BAR',true);echoFOO;//BARechofoo;//上面的BAR只是需要注意的几点。那么现在我将解释如下,为什么在不涉及上述情况的情况下我总是习惯使用const:const更具可读性和美观性。const默认在当前命名空间定义常量,但是使用define需要指定整个命名空间的完整路径:namespaceA\B\C;//如果要定义常量A\B\C\FOO:constFOO='BAR';define('A\B\C\FOO','BAR');从PHP5.6开始,const数组也可以定义为常量。而define目前不支持这个功能,但是这个功能会在PHP7中实现:constFOO=[1,2,3];//在PHP5.6中有效define('FOO',[1,2,3]);//在PHP5.6中无效,在PHP7.0中有效因为const是在编译时执行的,所以在速度上比define快。特别是使用define定义大量常量时,PHP的运行速度会变得很慢。人们甚至发明了apc_load_constantshide之类的东西来避免这个问题。与define相比,const可以使定义常量的效率提高一倍(在配置了XDebug的开发机器上,这种差异会更大)。但是在查询时间上,两者没有区别(因为都是使用同一张查询表)。最后要注意的是const可以用在类和接口中,但define不能这样做:classFoo{constBAR=2;//有效}classBaz{define('QUX',2);//invalid}总结除非你需要在条件语句中使用表达式或者定义常量,否则只是为了代码的简洁性和可读性,你最好使用const!