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新手上路(八)
Oct 09 PHP
php 小乘法表实现代码
Jul 16 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
Mar 26 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 PHP
Smarty foreach控制循环次数的实现详解
Jul 03 PHP
VPS中使用LNMP安装WordPress教程
Dec 28 PHP
php计算2个日期的差值函数分享
Feb 02 PHP
PHP文件缓存smarty模板应用实例分析
Feb 26 PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 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
MySQL修改密码方法总结
2008/03/25 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
js操作数组函数实例小结
2015/12/10 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
JS实现密码框效果
2020/09/10 Javascript
用实例分析Python中method的参数传递过程
2015/04/02 Python
详解Python中的正则表达式的用法
2015/04/09 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
jupyter notebook清除输出方式
2020/04/10 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
员工培训邀请函
2014/01/11 职场文书
我爱我家教学反思
2014/05/01 职场文书
爱护公共设施的标语
2014/06/24 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
2014年德育工作总结
2014/11/20 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android