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的输入输出流
Feb 14 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
让PHP支持断点续传的源码
May 16 PHP
php实现mysql数据库操作类分享
Feb 14 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
Jul 01 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
Oct 08 PHP
php微信公众号开发模式详解
Nov 28 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
Laravel数据库读写分离配置的方法
Oct 13 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目录函数实现创建、读取目录教程实例
2011/01/13 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
2019/02/15 PHP
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
Python编码爬坑指南(必看)
2016/06/10 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
python 实现Harris角点检测算法
2020/12/11 Python
Linux机考试题
2015/07/17 面试题
2014年师德师风工作总结
2014/11/25 职场文书
销售2014年度工作总结
2014/12/08 职场文书
创业计划书之校园超市
2019/09/12 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
Python基础之元类详解
2021/04/29 Python
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python