一、const
PHP5.3以前,const只能在类内部声明变量,5.3+允许在外部声明变量,但还不能使用常量计算!
const ONE = 1;
const WORD = 'hello world';
PHP5.6开始,const支持包括数值、字符串字面量以及其他常量在内的数值表达式,进行常量定义。并且更重要的是const开始支持定义常量数组!
const ONE = 1;
const TWO = ONE * 2;
const ARR = ['a', 'b'];
需要注意的是const并不支持对变量及方法的常量定义,如:
$path = __DIR__;
const CURR_PATH = $path;
const CEIL_NUM = ceil(7.3);
以上代码将会报错“Constant expression contains invalid operations”。
另外,const也无法在类方法中使用。
二、define
在PHP5.6以前,const能做的,define都能做到!并且define是支持对变量及方法的常量定义的,如:
$path = __DIR__;
define('CURR_PATH', $path);
define('CEIL_NUM', ceil(7.3));
但是在PHP7.0以前,define并不支持定义数组常量,如果一定要类似地使用,你可能需要用到serialize和unserialize,但显然其成本太大。
define('ARR', ['a', 'b']);
以上代码在PHP7.0以前将会报错,7.0+则正常。
三、const和define的选择
撇开约定、规范而言,首要考虑的就是效率问题。因此我们必须要了解其各自的底层编译。
以下将使用PHP的扩展VLD对Opcode层进行分析,要重点关注的是OP数(number of ops:)以及系统级的函数调用(op)
1、先分析define,在php环境下,创建一个文件t.php,其代码如下:
define('S', 1);
执行VLD命令分析Opcode:
其中,OP数为5,执行操作用到了INIT_FCALL、SEND_VAL、DO_ICALL、RETURN 4个调用
2、接着分析const,将t.php的代码修改为:
const S=1;
执行VLD命名分析Opcode:
其中,OP数为2,执行操作用到了DECLARE_CONST、RETURN 2个调用
显然,const的效率远远超过define!
因此在const和define的选择上,建议优先采用const,除非需要定义的常量通过变量传递或者用方法处理时,才使用define。