资讯专栏INFORMATION COLUMN

[翻译]PHP中define()和const定义常量的区别

qqlcbb / 2474人阅读

摘要:从开始也允许把表达式用作常量的值了。具有更好的可读性,是语言结构而不是函数,而且与在类中定义类常量的形式保持一致。众所周知在用定义了大量的常量后会影响效率。人们设置发明了和来绕过导致的效率问题。

在PHP中可以通过define()和const两种方式定义常量
可是在开发中我们应该什么时候用define()定义常量,什么时候用const定义常量? 这两种方式定义常量的主要区别是什么?

从5.3版本开始PHP有两种方法来定义常量,使用const关键字或者是使用define()方法:

const FOO = "BAR";
define("FOO", "BAR");

两者之间最大的区别在于const是在编译时定义常量,而define()方法是在运行时定义常量。

const不能用在if语句中, defne()能用在if语句中。

 if(...) {
     const FOO = "BAR";//错误
 }
 if(...) {
     define("FOO", "BAR");//正确
 }

define()的一个常用场景是先判断常量是否已经定义再定义常量:

 if(defined("FOO)) {
     define("FOO", "BAR")
 }
 

const 定义常量时,值只能是静态标量(数字, 字符串, truefalse, null), 而define()方法可以把任意表达式的值用作常量的值。从PHP5.6开始const也允许把表达式用作常量的值了。

const BIT_5 = 1 << 5; //PHP5.6后支持,之前的PHP版本不支持
define("BIT_5", 1 << 5);// 所有PHP版本都支持

const 只允许简单的常量名,而define()可以把任何表达式的值用作常量名

for ($i = 0; $i < 32; $i++) {
    define("BIT_" . $i, 1 << $i);
}

const 定义的常量常量名是大小写敏感的,而传递truedefine()方法的第三个参数时可以定义大小写不敏感的常量。

define("FOO", "BAR", true);
echo FOO; //BAR
echo foo; //BAR

上面列举的都是const相较define()而言的一些缺点或者不灵活的地方,下面我们看一下为什么我个人推荐用const而不是define()来定义常量(除非要在上述列举的场景中定义常量)。

const 具有更好的可读性,const是语言结构而不是函数,而且与在类中定义类常量的形式保持一致。

const在当前的命名空间中定义常量, 而define()要实现类似效果必须在定义时传递完整的命名空间名称:

namespace ABC;
//To define the constant ABCFOO:
const FOO = "BAR";
define("ABCFOO", "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()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26092.html

相关文章

  • PHP常量详解:defineconst区别

    摘要:常量是一个简单的标识符。常量默认大小写敏感。通常常量标识符总是大写的。常量只能包含标量数据和。可以定义常量,但应尽量避免,因为会造成不可预料的结果。用于类成员变量的定义,一经定义,不可修改。 常量是一个简单的标识符。在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量)。常量默认大小写敏感。通常常量标识符总是大写的。 可以用define()函数来定义常量。在php5.3.0...

    netmou 评论0 收藏0
  • [PHP]常量定义: constdefine区别运用; 附constant解释

    摘要:常量默认为大小写敏感。一个常量一旦被定义,就不能再改变或者取消定义。常量只能包含标量数据,,和,不能是表达式。可以定义常量,但应尽量避免,因为会造成不可预料的结果。 前言 常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。通常常量标识符总是大写的。 在 PHP 5.3.0 之前可以用 defi...

    appetizerio 评论0 收藏0
  • php const define 区别

    摘要:但是前者比后者有更多的优点常量有数据类型,而宏常量没有数据类型。有些集成化的调试工具可以对常量进行调试,但是不能对宏常量进行调试。由于定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用修饰数据成员来实现。 (1) 编译器处理方式不同  define宏是在预处理阶段展开。  const常量是编译运行阶段使用。(2) 类型和安全检查不同  define宏没有类型,不做任何类型检查,...

    teren 评论0 收藏0
  • 面试题整理

    摘要:一个数据库的状态是否正常可以从哪些指标看出来,至少列出个答以及正在运行的进行监控,其中一个方式就是查看运行状态。 、一个数据库的状态是否正常可以从哪些指标看出来,至少列出2个 答QPS以及IOPS 正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态。 (1)QPS(每秒Query量) QPS = Questions(or Queries...

    MartinDai 评论0 收藏0
  • PHP学习记录(基础)

    摘要:最后改为超文本预处理器,于年诞生。注释单行注释多行注释你好单行注释你也好单行注释多行注释大家都好变量由一个美元符号后面跟变量名来表示变量名区分大小写。可变变量可变变量一个变量的变量名可以动态设置和使用。 PHP简介 最初用于维护个人主页,简写为:Personal HomePage。最后改为:Hypertext Preprocessor(超文本预处理器),于1994年诞生。 优势 性...

    crossoverJie 评论0 收藏0

发表评论

0条评论

qqlcbb

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<