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

PHP常量定义define与const的更多相关文章

  1. 宏定义define和const的区别

    define和const都可以用来定义常量,define的格式为:#define 标识符 字符串,const在定义常量前面,const类型定以后不能被修改,区别主要有如下几点: 1.编译器处理方式不同 ...

  2. PHP常量:define()和const的区别

    常量,就是一个用于存储“不会(也不允许)变化的数据”的标识符.比如圆周率,在一定的应用场景中,就是一个固定的值(人为规定为某个值).常量默认大小写敏感.通常常量标识符总是大写的. (1)define( ...

  3. c# - 常量定义与赋值

    1.前言 c#与Java很相似,但是不一样,又与js(JavaScript)相似,但是也不一样,所以我认为c#是Java和 js的孩子. 2.常量定义 字符串: const string = &quo ...

  4. PHP中定义常量define与const

    我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,也可减少团队开发的出错.那么define和const有什么区别呢? 1.const是一个语言结构:而define是一个函数 ...

  5. _编程语言_C++_宏定义#define 和 常量const 的区别

    C++中有两种定义常量的方式:#define预处理和const关键字 #define 预处理指令 #include <iostream> using namespace std; #def ...

  6. PHP常量定义之define与const对比

    简要归纳PHP中两个常量定义关键字的区别: 1.define是函数,const是语言结构,PHP编译时const速度快.2.define只能用在类外,const类内类外皆可.3.define定义的常量 ...

  7. 在php中define和const定义常量的区别

    define和const都可以用来定义常量,但是const定义常量的时候大小写敏感,而define可以通过设置第三个参数为true的时候来取消大小写敏感! 如图: 引用地址:点这里

  8. PHP中define()和const定义常量的区别

    在PHP中可以通过define()和const两种方式定义常量可是在开发中我们应该什么时候用define()定义常量,什么时候用const定义常量? 这两种方式定义常量的主要区别是什么? 从5.3版本 ...

  9. PHP中定义常量的区别,define() 与 const

      正文 在PHP5.3中,有两种方法可以定义常量: 使用const关键字 使用define()方法 const FOO = 'BAR'; define('FOO','BAR'); 这两种方式的根本区 ...

随机推荐

  1. ubuntu下helloworld内核模块编译

    1.hello.c #include<linux/init.h> #include<linux/module.h> MODULE_LICENSE("Dual BSD/ ...

  2. JVM学习笔记一:内存管理

    参考资料 本文参考:<深入理解Java虚拟机>作者 周志明 知识产权归作者所有 走近java java组成部分:java语言.各平台虚拟机.Class文件结构.java api 类库.第三 ...

  3. maven单元测试设置代理

    背景 环境需要设置代理才能够访问外部网络,如果只是运行java程序来访问网络,我们可以通过java -jar test.jar -DproxyHost=proxy_ip -DproxyPort=pro ...

  4. 微信小程序-滚动消息通知

    写在前面: 微信小程序学的不太多,做了一个简单的项目,回来很快时间内把在深圳两天的房租给赚回来了. 这次我主要想总结一下微信小程序实现上下滚动消息提醒,主要是利用swiper组件来实现,swiper组 ...

  5. vue2 和 webpack 配置环境使用

    http://blog.csdn.net/fungleo/article/details/53171052

  6. 微信小程序实现“鲜肉APP”首页效果

    项目地址http://git.oschina.net/djcx/WeiXinXiaoChengXu/tree/master 如果您觉得不错,记得给一个star 由于微信小程序目前是当下趋势,正好昨天弄 ...

  7. year:2017 month:7 day:19

    2017-07-19 JavaScript 一:javascirpt的对象 1:数组对象 声明方式:(1)var arr=new Array(): (2)var arr=new Array(12): ...

  8. 用u盘启动计算机

    上次只是做好了u盘启动盘,但是并没有说怎么安装系统.接下来说一下怎么装系统.链接:怎么把系统装进u盘(ultraiso) 电脑经常要用到u盘启动.设置u盘启动在bios设置里面进行设置.下面就来讲解一 ...

  9. 访问被拒绝。 说明: 访问服务此请求所需的资源时出错。服务器可能未配置为访问所请求的 URL。

    打开web.config 然后将 <authorization> <deny users="?" /> </authorization> 改为 ...

  10. hdu--5351--MZL's Border

    表示看这篇博客后找到了思路: http://blog.csdn.net/queuelovestack/article/details/47291195 补充一下数据,方便观察规律 m  LBorder ...