码迷,mamicode.com
首页 > Web开发 > 详细

PHP常量定义define与const

时间:2017-09-10 17:39:36      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:span   通过   需要   col   blog   com   声明变量   operation   表达   

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

标签:span   通过   需要   col   blog   com   声明变量   operation   表达   

原文地址:http://www.cnblogs.com/fanqi/p/7501396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!