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 相关文章推荐
实现分十页分向前十页向后十页的处理
Oct 09 PHP
php array_map array_multisort 高效处理多维数组排序
Jun 11 PHP
php中计算时间差的几种方法
Dec 31 PHP
PHP 存储文本换行实现方法
Jan 05 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
yii用户注册表单验证实例
Dec 26 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 PHP
laravel5.1框架model类查询的实现方法
Oct 08 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 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
yii分页组件用法实例分析
2015/12/28 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
js 模拟气泡屏保效果代码
2010/07/10 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
python写的ARP攻击代码实例
2014/06/04 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
python人民币小写转大写辅助工具
2018/06/20 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
什么是抽象
2015/12/13 面试题
大学生实习证明范本
2014/01/15 职场文书
前处理班长职位说明书
2014/03/01 职场文书
家长写给老师的建议书
2014/03/13 职场文书
颁奖典礼主持词
2014/03/25 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
行政二审代理词
2015/05/25 职场文书