在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 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()

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

  1. #define与const定义常量的区别

    首先,#define 宏定义,使用方法如下: 1 #define PI 3.14159 2 3 #define MAX(a,b) a>=b?a:b const使用方法 const [常量类型] ...

  2. define宏定义和const定义之间的区别

    define部分: 宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.) 宏的语法为: #define 宏名称 宏值 注意,宏定义不 ...

  3. css里面的let,js中let和var定义变量的区别

    javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"javascript 严格模式",比如下述的代码运行就会报错: let hello = ' ...

  4. mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  5. mysql存储过程set什么意思_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  6. [翻译]Why Functional Programming Matters

    Why Functional Programming Matters 函数式程序设计为什么至关重要 作者: John Hughes 翻译: CloudiDust [http://blog.csdn.n ...

  7. mac os linux pageup pagedown,[整理]Mac中的类似于Windows中的PageUp和PageDown以及Ctrl+Home和Ctrl+End...

    (1) 之前以为Ctrl+Home和Ctrl+End是 Command+向上箭头 Command+向下箭头 结果发现又好像不是. 刚发现的是: option(Alt)+向上箭头 option(Alt) ...

  8. arduino中 #define、const和int 的差别

    首选我们要了解到的一个信息是arduino板子上的两个参数SRAM:2KB,Flash:32KB; 对应到我们使用的电脑呢,你可以认为SRAM是我们的内存,而Flash由是硬盘.先把这个理解清楚. # ...

  9. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)

    在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...

最新文章

  1. Hadoop 故障整理
  2. CSS基础语法(三) CSS的6种特性
  3. 树莓派3显示服务器SSH拒绝了密码,脚本封杀尝试树莓派SSH密码的来源IP
  4. LeetCode 487. 最大连续1的个数 II(滑动窗口)
  5. C++设计模式-享元模式
  6. Web Hacking 101 中文版 十一、SQL 注入
  7. python分布式编程_python分布式爬虫中的rules有什么用
  8. Eclipse超级好看的主题,极力推荐
  9. 小米路由器3开启千兆_使用评测 篇三:家庭网络进入千兆时代—小米路由器4开箱及评测...
  10. 抖音短视频去水印方法 2018短视频伪原创
  11. Compiling for iOS 10.0, but module ‘xxx‘ has a minimum deployment target of iOS 12.0
  12. 学python对数学要求高吗_想要学好python编程一定要求数学要好吗?
  13. 计算机系的的毕业感言,计算机班同学的毕业感言
  14. selenium+chrome使用webrtc音频或视频时,默认开启麦克风和摄像头
  15. 免费微信批量公众号采集文章方法
  16. 姓名拼音首字母缩写_公司首字母缩写
  17. 判断手机是否支持google play服务
  18. Oracle中的commit与rollback
  19. Python基础知识(二)基本数据结构list列表和dict字典
  20. 2022年数据中心产业发展将呈现三大新趋势

热门文章

  1. awk实战:文件里面全是数字,实现大于100的求和并打印出所在行和这些数字的总和...
  2. 如何通过使用fiddler对安卓系统设备抓包总结
  3. OpenStack securityGroup rule Set
  4. 自己写的.Net(C#)代码×××
  5. Windows7下硬盘安装RHEL 6.1
  6. ubuntu lamp(apache+mysql+php) 环境搭建及相关扩展更新
  7. leveldb登山之路——cache
  8. 单主机Docker容器VLAN划分
  9. Vue2.0+ElementUI+PageHelper实现的表格分页
  10. 基于DNS实现智能化访问网站