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 相关文章推荐
利用 window_onload 实现select默认选择
Oct 09 PHP
php MYSQL 数据备份类
Jun 19 PHP
php 空格,换行,跳格使用说明
Dec 18 PHP
PHP register_shutdown_function函数的深入解析
Jun 03 PHP
使用php清除bom示例
Mar 03 PHP
初识Laravel
Oct 30 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
8个PHP数组面试题
Jun 23 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 PHP
laravel框架使用极光推送消息操作示例
Feb 15 PHP
解析laravel使用workerman用户交互、服务器交互
Apr 28 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
php下封装较好的数字分页方法
2010/11/23 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
php依赖注入知识点详解
2019/09/23 PHP
Opacity.js
2007/01/22 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
python控制台中实现进度条功能
2015/11/10 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
毕业生怎样写好自荐信
2013/11/11 职场文书
村长贪污检举信
2014/04/04 职场文书
销售团队口号大全
2014/06/06 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
python实现Nao机器人的单目测距
2021/09/04 Python
python基础之类属性和实例属性
2021/10/24 Python
MySQL 逻辑备份 into outfile
2022/05/15 MySQL