zoukankan      html  css  js  c++  java
  • PHP中define()和const定义常量的区别

    在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 ABC;
      //To define the constant ABCFOO:
      const FOO = 'BAR';
      define('ABCFOO', '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()

  • 相关阅读:
    Synchronized 锁 批量重偏向 和批量撤销
    Synchronize 偏向锁,轻量级锁升级和撤销过程,对象头的变化
    JAVA 对象到底有什么
    什么是操作系统虚拟地址
    从C角度看 i = i+ 1本质
    Linux操作系统的三种锁机制
    SpringCloud启动过程中如何完成Nacos服务注册
    Nacos源码一
    JAVA线程的本质
    SpringCloud启动-Nacos服务注册
  • 原文地址:https://www.cnblogs.com/tianshifu/p/7840940.html
Copyright © 2011-2022 走看看