PHP中define() 与 const定义常量的区别详解


Posted in PHP onJune 25, 2019

本文实例讲述了PHP中define() 与 const定义常量的区别。分享给大家供大家参考,具体如下:

前言

今天在Stackoverflow又看到一个很有趣的文章,所以翻译过后摘了过来。文章是由PHP开发成员之一的NikiC写的,权威性自然毋庸置疑

正文

在PHP5.3中,有两种方法可以定义常量:

  1. 使用const关键字
  2. 使用define()方法
const FOO = 'BAR';
define('FOO','BAR');

这两种方式的根本区别在于const会在代码编译时定义一个常量,而define则是在代码运行时才定义一个常量。这就使得const会有以下几个缺点:

  • const不能在条件语句中使用。如果要定义一个全局变量,const必须要处于整个代码的最外层:
if (...) {
  const FOO = 'BAR';  // 无效的
}
// but
if (...) {
  define('FOO', 'BAR'); // 有效的
}

你可以能会问为什么我要这么做?一个最平常的例子是当你在检测一个常量是否已经被定义时:

if (!defined('FOO')) {
  define('FOO', 'BAR');
}
  • const只能用来声明变量(如数字、字符串,或者true, false, null, _FILE_),而define()还能接受表达式。不过在PHP5.6之后const也可以接受常量的表达式了:
const BIT_5 = 1 << 5;  // 在PHP5.6之后有效,之前无效
define('BIT_5', 1 << 5); // 一直有效
  • const的常量命名只能用直白的文本,而define()允许你用任何表达式来对常量命名。这样我们就可以执行以下操作:
for ($i = 0; $i < 32; ++$i) {
  define('BIT_' . $i, 1 << $i);
}
  • const定义的常量是大小写敏感的,但是define允许你将其第三个参数设置为true来关闭其对大小写的敏感:
define('FOO', 'BAR', true);
echo FOO; // BAR
echo foo; // BAR

以上就是你需要注意的几点。那么现在我来说明以下,为什么不涉及以上情况下,我个人总是习惯使用const

  • const更加易读、美观。
  • const默认在当前的namespace下定义常量,而使用define则需要你写明整个namespace的完整路径:
namespace A\B\C;
// 如果要定义常量 A\B\C\FOO:
const FOO = 'BAR';
define('A\B\C\FOO', 'BAR');
  • 自从PHP5.6后,使用const数组也能被定义为常量。而define目前是不支持这一功能的,但是该功能会在PHP7中被实现:
const FOO = [1, 2, 3];  // 在PHP 5.6中有效
define('FOO', [1, 2, 3]); // 在PHP 5.6无效, 在PHP 7.0有效
  • 因为const在编译时就被执行了,所以它在速度上要比define快一点。

尤其是在使用define定义大量常量时,PHP的运行速度会变得非常慢。人们甚至发明了诸如apc_load_constantshide来避免这个问题

define相比,const能使定义常量的效率提高一倍(在配置有XDebug的开发机器上,这个差异还会更大)。但是在查询时间上,两者是没有区别的(因为二者用的都是同一个查询表)

最后需要注意的一点是,const可以在classinterface当中使用 ,而define是做不到这一点的:

class Foo {
  const BAR = 2; // 有效
}
class Baz {
  define('QUX', 2); // 无效
}

总结

除非你需要使用表达式或者在条件语句中定义常量,不然的话仅仅是为了代码的简单可读性你都最好要使用const

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
Jan 10 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
探讨GDFONTPATH能否被winxp下的php支持
Jun 21 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
Nov 07 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
php数组合并的二种方法
Mar 21 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
老生常谈PHP位运算的用途
Mar 12 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 PHP
PHP编译configure时常见错误的总结
Aug 17 PHP
PHP预定义接口――Iterator用法示例
Jun 05 PHP
php字符串截取函数mb_substr用法实例分析
Jun 25 #PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 #PHP
Laravel向公共模板赋值方法总结
Jun 25 #PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 #PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 #PHP
php字符串过滤strip_tags()函数用法实例分析
Jun 24 #PHP
提高Laravel应用性能方法详解
Jun 24 #PHP
You might like
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
2017/03/02 PHP
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
Python模块WSGI使用详解
2018/02/02 Python
python中必要的名词解释
2019/11/20 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
大学生入党自我鉴定
2013/10/31 职场文书
不错的求职信范文
2014/07/20 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
一般纳税人申请报告
2015/05/18 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB
Java 多线程并发FutureTask
2022/06/28 Java/Android