[翻译]PHP中define()和const定义常量的区别
在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
定义常量时,值只能是静态标量(数字, 字符串,true
,false
,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
定义的常量常量名是大小写敏感的,而传递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()
。
[翻译]PHP中define()和const定义常量的区别相关推荐
- #define与const定义常量的区别
首先,#define 宏定义,使用方法如下: 1 #define PI 3.14159 2 3 #define MAX(a,b) a>=b?a:b const使用方法 const [常量类型] ...
- define宏定义和const定义之间的区别
define部分: 宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.) 宏的语法为: #define 宏名称 宏值 注意,宏定义不 ...
- css里面的let,js中let和var定义变量的区别
javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"javascript 严格模式",比如下述的代码运行就会报错: let hello = ' ...
- mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...
- mysql存储过程set什么意思_浅谈MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...
- [翻译]Why Functional Programming Matters
Why Functional Programming Matters 函数式程序设计为什么至关重要 作者: John Hughes 翻译: CloudiDust [http://blog.csdn.n ...
- mac os linux pageup pagedown,[整理]Mac中的类似于Windows中的PageUp和PageDown以及Ctrl+Home和Ctrl+End...
(1) 之前以为Ctrl+Home和Ctrl+End是 Command+向上箭头 Command+向下箭头 结果发现又好像不是. 刚发现的是: option(Alt)+向上箭头 option(Alt) ...
- arduino中 #define、const和int 的差别
首选我们要了解到的一个信息是arduino板子上的两个参数SRAM:2KB,Flash:32KB; 对应到我们使用的电脑呢,你可以认为SRAM是我们的内存,而Flash由是硬盘.先把这个理解清楚. # ...
- C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)
在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...
最新文章
- Hadoop 故障整理
- CSS基础语法(三) CSS的6种特性
- 树莓派3显示服务器SSH拒绝了密码,脚本封杀尝试树莓派SSH密码的来源IP
- LeetCode 487. 最大连续1的个数 II(滑动窗口)
- C++设计模式-享元模式
- Web Hacking 101 中文版 十一、SQL 注入
- python分布式编程_python分布式爬虫中的rules有什么用
- Eclipse超级好看的主题,极力推荐
- 小米路由器3开启千兆_使用评测 篇三:家庭网络进入千兆时代—小米路由器4开箱及评测...
- 抖音短视频去水印方法 2018短视频伪原创
- Compiling for iOS 10.0, but module ‘xxx‘ has a minimum deployment target of iOS 12.0
- 学python对数学要求高吗_想要学好python编程一定要求数学要好吗?
- 计算机系的的毕业感言,计算机班同学的毕业感言
- selenium+chrome使用webrtc音频或视频时,默认开启麦克风和摄像头
- 免费微信批量公众号采集文章方法
- 姓名拼音首字母缩写_公司首字母缩写
- 判断手机是否支持google play服务
- Oracle中的commit与rollback
- Python基础知识(二)基本数据结构list列表和dict字典
- 2022年数据中心产业发展将呈现三大新趋势
热门文章
- awk实战:文件里面全是数字,实现大于100的求和并打印出所在行和这些数字的总和...
- 如何通过使用fiddler对安卓系统设备抓包总结
- OpenStack securityGroup rule Set
- 自己写的.Net(C#)代码×××
- Windows7下硬盘安装RHEL 6.1
- ubuntu lamp(apache+mysql+php) 环境搭建及相关扩展更新
- leveldb登山之路——cache
- 单主机Docker容器VLAN划分
- Vue2.0+ElementUI+PageHelper实现的表格分页
- 基于DNS实现智能化访问网站