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 DataGrid 实现代码
Aug 12 PHP
PHP连接MongoDB示例代码
Sep 06 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
部署PHP时的4个配置修改说明
Oct 19 PHP
php获取远程文件内容的函数
Nov 02 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
全新Mac配置PHP开发环境教程
Feb 03 PHP
几行代码轻松实现PHP文件打包下载zip
Mar 01 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
Aug 14 PHP
PHP convert_cyr_string()函数讲解
Feb 13 PHP
php使用yield对性能提升的测试实例分析
Sep 19 PHP
php实现对文件压缩简单的方法
Sep 29 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
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
python爬虫 正则表达式解析
2019/09/28 Python
Python tkinter模版代码实例
2020/02/05 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
材料采购员岗位职责
2013/12/17 职场文书
中学生差生评语
2014/01/30 职场文书
高中物理教学反思
2014/02/08 职场文书
副护士长竞聘演讲稿
2014/04/30 职场文书
广播体操比赛口号
2014/06/10 职场文书
机械工程师岗位职责
2014/06/16 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
成都人事代理协议书
2014/10/25 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers