一、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. 解决kindeditor编辑器中使用百度地图时不能拖动坐标的问题

    覆盖\plugins\baidumap文件夹下的map.html代码即可 <!doctype html><html><head>    <meta http- ...

  2. vue指令v-else-if示例解析

    表示 v-if 的 "else if 块".可以链式调用. <div id="app"> <p v-if="isRender&quo ...

  3. Python数据可视化Matplotlib——Figure画布背景设置

    之前在今日头条中更新了几期的Matplotlib教学短视频,在圈内受到了广泛好评,现应大家要求,将视频中的代码贴出来,方便大家学习. 为了使实例图像显得不单调,我们先将绘图代码贴上来,此处代码对Fig ...

  4. Ruby01: Beginner

    中整個早上都忙著作業,看來是假期懶了一下現在現眼報吧哈哈.在上課之前發一下Ruby 的首章,算是倉促的開始吧. puts puts "Once upon a time... there's ...

  5. HTML的正确入门姿势——基本结构与基本标签

    一.什么是HTML HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML文档的结构 HTML文档主要包括三大部分:文档声明部分.<head>头部部 ...

  6. chrome地址栏命令

    Chrome作为一个前端开发的标准浏览器,用来体验和测试日新月异的新特性,自然是没话说. 有些新特性是需要特意开启设置的,有很多浏览器的内置功能也是要通过命令来开启或者使用的. Chrome 有很多的 ...

  7. Oracle进阶研究问题收集

    1. buffer busy waits http://www.itpub.net/thread-1801066-1-4.html 2. 深入理解oracle log buffer http://ww ...

  8. RabbitMQ --- Publish/Subscribe(发布/订阅)

    目录 RabbitMQ --- Hello Mr.Tua RabbitMQ --- Work Queues(工作队列) 前言 在第二篇文章中介绍了 Work Queues(工作队列),它适用于把一个消 ...

  9. Android Studio 实用调试技巧

    Android Studio 是个发工具,其自身带调式环境是很强大的,我们要摆脱只会使用Log打印日志的低效的方法,掌握高级调试技巧对每个Android开发者都是很必要的,废话少说,直入正题 调试方式 ...

  10. Python二分法查找及变种分析

    基于Python3 普通二分法查找目标值的index 二分法查找的思路很简单,先确定好列表nums的一头start一尾end,中间值middle根据头尾数值之和用地板除法除以2,即(start + e ...