正文

在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可以在class和interface当中使用 ,而define是做不到这一点的:

class Foo {
const BAR = 2; // 有效
}
class Baz {
define('QUX', 2); // 无效
}

总结

除非你需要使用表达式或者在条件语句中定义常量,不然的话仅仅是为了代码的简单可读性你都最好要使用const

最新文章

  1. SQL-类型转换函数
  2. UDP通信
  3. JavaScript 的倒计时
  4. 微信中a链接无法进行跳转
  5. ASP.NET MVC 5改进了基于过滤器的身份验证
  6. add a path cgi-bin to asp.net mvc
  7. %hd %d %ld %u ......
  8. [LeetCode]题解(python):062-Unique Paths
  9. Docker 第三篇--构建Image
  10. java断点
  11. Extending the Yahoo! Streaming Benchmark
  12. Winform关于未找到元数据文件.exe和不包含适合于入口点的静态“Main”方法
  13. 英雄联盟lol登录错误:登录服务器未响应、您可能遇到了一个网络问题、请检查您的网络。
  14. PAT A1075 PAT Judge (25 分)——结构体初始化,排序
  15. Zabbix Agent active批量调整客户端为主动模式监控
  16. HDU1711 Number Sequence KMP
  17. swing自定义border
  18. Linux系统优势六大方面
  19. Oracle Sql Developer 连接 SqlServer
  20. NIO、Servlet3.0、HTTP1.1

热门文章

  1. HTML和XML中的转义字符
  2. [转]理解Linux的性能
  3. java - day011 - 集合, ArrayList HashMap,HashSet, Iterator 接口, for-each 循环格式
  4. C++——new &amp; delete
  5. Linux学习之五-Linux系统终端常用的快捷键
  6. IIS 自动化发布工具实现【一】
  7. linux网络编程之system v消息队列(二)
  8. SQL SERVER中如何查找存储过程中一段代码
  9. 用来遍历map集合的方法
  10. burp插件debug