PHP常量定义define与const

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP常量定义define与const相关的知识,希望对你有一定的参考价值。

一、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”。

 

二、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。

 

以上是关于PHP常量定义define与const的主要内容,如果未能解决你的问题,请参考以下文章

PHP常量定义之define与const对比

PHP常量定义之define与const对比

PHP常量定义define与const

PHP中定义常量define与const

php中const与define的区别

php----------const 定义的常量和define()定义的常量的区别?