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中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
Nov 10 PHP
解析php中memcache的应用
Jun 18 PHP
php中file_get_content 和curl以及fopen 效率分析
Sep 19 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
php限制ip地址范围的方法
Mar 31 PHP
php实用代码片段整理
Nov 12 PHP
Zend Framework处理Json数据方法详解
Dec 09 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
详解php实现页面静态化原理
Jun 21 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
php下的原生ajax请求用法实例分析
Feb 28 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 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 array_multisort()函数的使用札记
2011/07/03 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
2019/09/19 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
Vue仿百度搜索功能
2020/12/28 Vue.js
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
python机器人行走步数问题的解决
2018/01/29 Python
pandas分区间,算频率的实例
2019/07/04 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
python socket 聊天室实例代码详解
2019/11/14 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
会议接待欢迎词
2014/01/12 职场文书
家长会标语
2014/06/24 职场文书
2015年护士节慰问信
2015/03/23 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
MySQL 全文索引使用指南
2021/05/25 MySQL
Window server中安装Redis的超详细教程
2021/11/17 Redis