PHP 中新增 const 常量与 define 的异同

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2015/01/05/difference-between-const-and-define-in-php/

Overview

PHP 5.3 中新增了 const 关键词用于定义常量,本文介绍其与 define 直接的区别。

const 关键词用法如下:

1const XXX = 1; 

这样的常量定义语法,虽然说他可以和define 一样用,但总归是不同的,不同之处如下:

1. namespace 绑定

define 定义的常量默认不受 namespace 约束,是全局常量,而 const 则受 namespace 严格约束,为局部常量,可以参考如下代码:

 1<?php
 2namespace A;
 3
 4define('dddd', 234); # define dddd 1
 5const dddd = 4444; # define dddd 2
 6
 7namespace A\B;
 8
 9echo dddd, '<br>'; /* echo dddd.1*/
10const dddd = 123; # define dddd 3
11echo dddd, '<br>'; /* echo dddd.3*/
12
13namespace B;
14
15echo dddd, '<br>'; /* echo dddd.1*/
16echo \A\dddd, '<br>'; /* echo dddd.2*/
17echo \A\B\dddd, '<br>'; /* echo dddd.3*/

实际上也可用 define('A\B\C', 213); 定义特定命名空间下的常量。

2. const 只能接受字面量

define 可以接受任何结果为数值、字符串型的表达式,而 const 只能用字面量,参考如下:

1<?php
2define('ddd', strlen('ddd')); /*OK*/
3define('abc', 111 * 3333); /*OK*/
4const abc = 123; /*OK*/
5const abc = 'ffff'; /*OK*/
6const abc = strlen('ddd'); /* FORGET IT, NO WAY */
7const abc = 123 * 44433; /* FORGET IT, NO WAY */

3. const 是静态常量

const 生效在编译阶段,不能在执行过程中根据条件定义 const 常量,而 define 可以,因为后者是函数,参考如下:

1<?php
2
3if (1 < 5) {
4    define('ddd', 123);
5}
6
7if (5 > 3) {
8    const kkk = 321; /* NO WAY */
9}

4. define 允许大小写不敏感的常量名

1<?php
2
3define('ddd', 123, true);
4
5echo DdD;
6
7const kkk = 555;
8
9echo kKk; # WHAT IS kKk?

归纳了这几点,使用 const 时千万注意了,如果还有别的我会继续补充。

comments powered by Disqus