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编写大型网站问题集
Mar 06 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
Jun 17 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
PHP统计二维数组元素个数的方法
Nov 12 PHP
php调整gif动画图片尺寸示例代码分享
Dec 05 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 PHP
为你总结一些php系统类函数
Oct 21 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
PHP的mysqli_select_db()函数讲解
Jan 23 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 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(codeigniter)安全性注意事项
2017/04/06 PHP
使用JQuery进行跨域请求
2010/01/25 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
Python切片知识解析
2016/03/06 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
详解Python pygame安装过程笔记
2017/06/05 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
python的concat等多种用法详解
2018/11/28 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
工程师自我评价怎么写
2013/09/19 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
导游词之镇江焦山
2019/11/21 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
vue组件vue-esign实现电子签名
2022/04/21 Vue.js