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

从5.3版本开始PHP有两种方法来定义常量,使用const关键字或者是使用define()方法:

const FOO = 'BAR';
define('FOO', 'BAR');

两者之间最大的区别在于const是在编译时定义常量,而define()方法是在运行时定义常量。

  • const不能用在if语句中, defne()能用在if语句中。

     if(...) {
    const FOO = 'BAR';//错误
    }
    if(...) {
    define('FOO', 'BAR');//正确
    }

    define()的一个常用场景是先判断常量是否已经定义再定义常量:

     if(defined('FOO)) {
    define('FOO', 'BAR')
    }
  • const 定义常量时,值只能是静态标量(数字, 字符串, truefalsenull), 而define()方法可以把任意表达式的值用作常量的值。从PHP5.6开始const也允许97影院把表达式用作常量的值了。

    const BIT_5 = 1 << 5; //PHP5.6后支持,之前的PHP版本不支持
    define('BIT_5', 1 << 5);// 所有PHP版本都支持
  • const 只允许简单的常量名,而define()可以把任何表达式的值用作常量名

    for ($i = 0; $i < 32; $i++) {
    define('BIT_' . $i, 1 << $i);
    }
  • const 定义的常量常量名是大小写敏感的,而传递truedefine()方法的第三个参数时可以定义大小写不敏感的常量。

    define('FOO', 'BAR', true);
    echo FOO; //BAR
    echo foo; //BAR

上面列举的都是const相较define()而言的一些缺点或者不灵活的地方,下面我们看一下为什么我个人推荐用const而不是define()来定义常量(除非要在上述列举的场景中定义常量)。

  • const 具有更好的可读性,const是语言结构而不是函数,而且与在类中定义类常量的形式保持一致。

  • const在当前的命名空间中定义常量, 而define()要实现类似效果必须在定义时传递完整的命名空间名称:

    namespace A\B\C;
    //To define the constant A\B\C\FOO:
    const FOO = 'BAR';
    define('A\B\C\FOO', 'BAR');
  • const从PHP5.6版本开始可以把数组用作常量值,而define()在PHP7.0版本开始才支持把数组用作常量值。

    const FOO = [1, 2, 3];// valid in PHP 5.6
    define('FOO', [1, 2, 3]);// www.97yingyuan.org invalid in PHP 5.6, valid in PHP 7.0
  • 因为const是语言结构并且在编译时定义常量所以const会比define() 稍稍快一些。

    众所周知PHP在用define()定义了大量的常量后会影响效率。 人们设置发明了apc_load_constants()hidef来绕过define()导致的效率问题。

最后,const还能被用于在类和接口中定义常量,define()只能被用于在全局命名空间中定义常量:

class FOO
{
const BAR = 2;// 正确
} class Baz
{
define('QUX', 2)// 错误
}

总结:
除非要在if分支里定义常量或者是通过表达式的值来命名常量, 其他情况(即使是只是简单的为了代码的可读性)都推荐用const替代define()

PHP中define()和const定义常量的区别的更多相关文章

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

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

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

    自 PHP 5.3.0 起,有两种方式定义常量,使用 const 关键字或者 define() 函数:   1 2 const FOO = 'BAR'; define('FOO', 'BAR'); 这 ...

  3. const define 定义常量的区别

    1.用const定义常量在编译的时候,提供了类型安全检查,而define 只是简单地进行字符串的替换 2.const定义的常量,会分配相应的内存空间.而define没有分配空间,只是在程序中与处理的时 ...

  4. const和define在值定义上的区别

    (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...

  5. C++中define与const的区别

    C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常 ...

  6. iOS学习——#define、const、typedef的区别

    在iOS开发中经常遇到一些字段和类型的定义,例如配置生产和测试不同环境的参数等,这时候经常用到#define.const以及typedef.那么它们之间有什么区别呢?我们接下来一个一个具体了解下. 一 ...

  7. #define、const、typedef的区别

    #define.const.typedef的区别 #define 并不是定义变量, 只是用来做文本替换 例如: #define PI 3.1415926 float angel; angel=30*P ...

  8. JavaScript中var和this定义变量的区别

    JavaScript中var和this定义变量的区别 在js中声明变量时可以使用var和this,但使用this的有很大一部分参考书是没有的,经过查阅相关资料总结如下: 用var和this声明变量,存 ...

  9. C++ —— 非类中使用const定义常量的初始化,以及#define和typedef的区别

    总结一下在非类中使用const关键字定义常量时的初始化问题,亲测VS2015.顺便记录#define宏和typedef的区别. 1 首先对const声明的常量的初始化做简单小结: , w2 = , w ...

随机推荐

  1. JFinal免费公开课更新中

    价值千元的课程,免费报名学习,JFinal学院-小木 录制JFinal视频教程,JFinal核心已经周边涉及到微信小程序开发.数据库.前端实战等.

  2. python_84_os模块

    'os模块:提供对操作系统进行调用的接口' import os print(os.getcwd())#获取当前脚本工作目录,即当前Python脚本工作的目录路径 os.chdir('C:\\Users ...

  3. Python 模块(二)

    1 logging 模块 logging有两种的配置的方式,configure.logger 1.1 config方式 import logging ''' 日志的配置:config模式 只能选择在屏 ...

  4. Spring多种方式实现依赖注入

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  5. JVM内存模型与GC算法(简介)

    JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明. 1.1程序计数器 ...

  6. POP简单动画简单使用 (入门级别)

    动画可以让APP“更友好”的与用户交互,苹果提供很多的好看的动画供开发者使用,不过简单的平移.旋转.缩放.......使用起来很简单,但是想要进行一些比较复杂的动画效果,使用起来就比较难以实现,俗话说 ...

  7. cron job 里面,如何让脚本半分钟运行一次?

    cron job 里面,如何让脚本半分钟运行一次? cron本身实现不了.但可以借助于sleep命令实现. 解决方法: 两个脚本 一个正常,一个增加sleep 30 crontab设置同时启动 在有的 ...

  8. Spinal Tap Case -freecodecamp算法题目

    Spinal Tap Case 1.要求 将字符串转换为 spinal case. Spinal case 是 all-lowercase-words-joined-by-dashes 这种形式的,也 ...

  9. tensorflow目标检测API安装及测试

    1.环境安装配置 1.1 安装tensorflow 安装tensorflow不再仔细说明,但是版本一定要是1.9 1.2 下载Tensorflow object detection API  下载地址 ...

  10. CNCF 有哪些具体的项目内容?

    前言:CNCF(Cloud Native Computing Foundation)于 2015 年 7 月成立,隶属于 Linux 基金会,初衷围绕“云原生”服务云计算,致力于维护和集成开源技术,支 ...