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”。
另外,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的更多相关文章
- 宏定义define和const的区别
define和const都可以用来定义常量,define的格式为:#define 标识符 字符串,const在定义常量前面,const类型定以后不能被修改,区别主要有如下几点: 1.编译器处理方式不同 ...
- PHP常量:define()和const的区别
常量,就是一个用于存储“不会(也不允许)变化的数据”的标识符.比如圆周率,在一定的应用场景中,就是一个固定的值(人为规定为某个值).常量默认大小写敏感.通常常量标识符总是大写的. (1)define( ...
- c# - 常量定义与赋值
1.前言 c#与Java很相似,但是不一样,又与js(JavaScript)相似,但是也不一样,所以我认为c#是Java和 js的孩子. 2.常量定义 字符串: const string = &quo ...
- PHP中定义常量define与const
我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,也可减少团队开发的出错.那么define和const有什么区别呢? 1.const是一个语言结构:而define是一个函数 ...
- _编程语言_C++_宏定义#define 和 常量const 的区别
C++中有两种定义常量的方式:#define预处理和const关键字 #define 预处理指令 #include <iostream> using namespace std; #def ...
- PHP常量定义之define与const对比
简要归纳PHP中两个常量定义关键字的区别: 1.define是函数,const是语言结构,PHP编译时const速度快.2.define只能用在类外,const类内类外皆可.3.define定义的常量 ...
- 在php中define和const定义常量的区别
define和const都可以用来定义常量,但是const定义常量的时候大小写敏感,而define可以通过设置第三个参数为true的时候来取消大小写敏感! 如图: 引用地址:点这里
- PHP中define()和const定义常量的区别
在PHP中可以通过define()和const两种方式定义常量可是在开发中我们应该什么时候用define()定义常量,什么时候用const定义常量? 这两种方式定义常量的主要区别是什么? 从5.3版本 ...
- PHP中定义常量的区别,define() 与 const
正文 在PHP5.3中,有两种方法可以定义常量: 使用const关键字 使用define()方法 const FOO = 'BAR'; define('FOO','BAR'); 这两种方式的根本区 ...
随机推荐
- Android学习笔记-TextView(文本框)(一)
1.基础属性详解: id:为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获取到该对象,然后进行相关属性的设置,又或者使用RelativeL ...
- 访问被拒绝。 说明: 访问服务此请求所需的资源时出错。服务器可能未配置为访问所请求的 URL。
打开web.config 然后将 <authorization> <deny users="?" /> </authorization> 改为 ...
- NYOJ--水池数目
//NYOJ--水池数目 #include<iostream> #include<cstring> }; using namespace std; void dfs(int,i ...
- 菜鸟的 Sass 学习笔记
介绍 sass 是什么?? 在sass的官网,它是这么形容给自己的 Sass is the most mature, stable, and powerful professional grade C ...
- Java的原始类型自动包装与解包机制
java5之后对原始数据类型如int.char.long等基本数据类型有自动打包成相应的复合类型Integer.Character.Long等的机制:也可以将复合类型自动转换为原始类型. 这取决于程序 ...
- 2017年最重要的HTML5开发手册,传播正能量
今天给大家推荐这个HTML5开发手册,希望能帮助正在学习web前端的人,鄙人也是刚学习前端没多久,借助于一点资讯平台能够结识更多前端大牛,这是我的HTML5进阶学习一点资讯群:250777811,里面 ...
- 《利用python进行数据分析》NumPy基础:数组和矢量计算 学习笔记
一.有关NumPy (一)官方解释 NumPy is the fundamental package for scientific computing with Python. It contains ...
- AIX缩小逻辑卷报错chfs: 0506-964
--AIX缩小逻辑卷报错chfs: 0506-964 -----------------------------------------2013/10/29 通过smit chfs/或 chfs命令 ...
- C/C++ 知识点---链表操作
1.单链表单链表的结点类型node定义: typedef struct linknode { int data; struct linknode *node; }node; <1>.建立单 ...
- WebService核心文件【web-config.wsdd】调用操作
WebService核心文件[server-config.wsdd]详解及调用示例 作者:玛莎拉蒂-小贱人 一.准备工作 导入需要的jar包: 二.配置web.xml 在web工程的web.xml中添 ...