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

[译文]PHP中define()和const的区别

时间:2023-03-30 02:36:51 PHP

在PHP中,可以通过define()和const两种方式来定义常量,但是在开发中,什么时候应该使用define()来定义常量呢?const定义一个常量?这两种定义常量的方法之间的主要区别是什么?从5.3版本开始,PHP有两种定义常量的方法,使用const关键字或使用define()方法:constFOO='BAR';define('FOO','BAR');两者最大的区别是因为const在编译时定义常量,而define()方法在运行时定义常量。const不能用在if语句中,defne()可以用在if语句中。if(...){constFOO='BAR';//错误}if(...){define('FOO','BAR');//正确}define()的一个常见场景是判断first在定义常量之前是否定义了常量:if(defined('FOO)){define('FOO','BAR')}const定义常量时,其值只能是静态标量(number,string,true,false,null),define()方法可以使用任何表达式的值作为常量的值。从PHP5.6开始,const也允许表达式作为常量值使用。常量BIT_5=1<<5;//PHP5.6之后支持,之前的PHP版本不支持define('BIT_5',1<<5);//所有PHP版本都支持const只允许简单的常量名,而define()可以使用any的值表达式作为常量名称for($i=0;$i<32;$i++){define('BIT_'.$i,1<<$i);}constdefinedConstant常量名称区分大小写,并且将true传递给define()方法的第三个参数可以定义一个不区分大小写的常量。define('FOO','BAR',true);echoFOO;//BARechofoo;//BAR列举了const相对于define()的一些缺点或者不灵活,下面我们一起看看为什么我个人建议使用const而不是define()来定义常量(除非你想在上面列出的场景中定义常量)。const具有更好的可读性,const是一种语言结构而不是函数,并且与类中定义类常量的形式一致。const定义当前命名空间中的常量,define()在定义时必须传递完整的命名空间名称,以达到类似的效果:namespaceA\B\C;//要定义常量A\B\C\FOO:constFOO='BAR';define('A\B\C\FOO','BAR');const从PHP5.6开始可以使用数组作为常量值,而define()从PHP7.0开始支持使用数组作为常量值。constFOO=[1,2,3];//在PHP5.6中有效define('FOO',[1,2,3]);//在PHP5.6中无效,在PHP7.0中有效,因为const是一种语言结构并且in常量是在编译时定义的,所以const比define()稍微快一些。众所周知PHP用define()定义大量常量后会影响效率。人们设置并发明了apc_load_constants()和hidef来绕过define()带来的效率问题。最后,const也可以用于定义类和接口中的常量,define()只能用于定义全局命名空间中的常量:classFOO{constBAR=2;//正确}classBaz{define('QUX',2)//Error}总结:除非你想在if分支中定义一个常量或者用表达式的值来命名常量,否则在其他情况下(即使只是为了代码的可读性),都是建议使用const而不是define()。