引言

我们今天说一下 PHP 编程中,定义一个常量所使用的两种方法。有哪些区别,以及哪种是最佳实践?

问题

有开发者说,我在学习编写 PHP,可是定义常量的方法很是让人迷惑。比如有下面这样的写法:

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

而且在框架中,也大量地掺杂着两种定义方法的混用。到底哪一个好?

深层原因

对于 PHP5.3 及以上,定义一个常量有两种方法,一个是用 const 关键字,一个是使用 define 函数。比如这样写:

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

这两种方式之间的根本区别是const在编译时定义常量,而define在运行时定义常量。这导致了大多数const的缺点。下面列举一些:

1 - const不能用于有条件地定义常量。要定义全局常量,必须在最外层范围中使用它:

if (...) { const FOO = 'BAR'; // 无效}// 但是if (...) { define('FOO', 'BAR'); // 有效}

一种常见的应用是检查常量是否已经定义:

if (!defined('FOO')) {define('FOO', 'BAR');}

2 - const只能接受一个静态标量(数字,字符串或其它常量值true,false,null,__FILE__),而define()可使用任何表达式。

const BIT_5 = 1 << 5; // VPHP 5.6 以下版本均无效define('BIT_5', 1 << 5); // 有效

3 - const只能采用简单的常量名称,而define()接受任何表达式作为名称。这样可以执行以下操作:

for ($i = 0; $i < 32; ++$i) { define('BIT_' . $i, 1 << $i);}

4 - consts始终区分大小写,而define()允许您通过将其true作为第三个参数传递来定义不区分大小写的常量。

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

const 的优点

除了上一节所说的 const 的缺点外,我一般都会坚持使用 const。因为它实在太好用,太可爱了。

1 - const使代码更好读。

它是一种语言构造,而不是函数,并且与您在类中定义常量的方式保持一致。

2 - const作为一种语言构造,可以通过自动化工具进行静态分析。

3 - const在当前名称空间中定义一个常量,同时define()必须传递完整的名称空间名称:

namespace A\B\C;// 定义常量 A\B\C\FOO:const FOO = 'BAR';define('A\B\C\FOO', 'BAR');

4 - 由于PHP 5.6const常量也可以是数组,而define()尚不支持数组。但是,PHP 7中的两种情况都支持数组。

const FOO = [1, 2, 3]; // PHP 5.6 及以上有效define('FOO', [1, 2, 3]); // PHP 7.0 及以上有效

5 - const还可以在类或接口内使用它来定义类常量或接口常量。define没这功能。

class Foo {const BAR = 2; // 完全支持}// 但是class Baz {define('QUX', 2); // 不能这么写}

写在最后

除非特别需要,我一般不使用 define 定义常量,可读性不强。

加上框架中强制的 OOP 方式,使得我们自觉不自觉地形成 const 定义类常量的习惯。而且对于 IDE 的自动索引也极为友好,写代码顺溜的不得了。

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

const没define好用 php,3分钟短文|PHP 定义常量,我该用define还是const?这下不迷茫了...相关推荐

  1. 在定义常量时,为什么推荐使用const,而不是#define?

    在定义常量时,为什么推荐使用const,而不是#define? const修饰词可以将一个变量修饰为"只读",这个就能称为常量么?姑且认为可以.const是只读的意思,它限定一个变 ...

  2. [翻译]PHP中define()和const定义常量的区别

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

  3. C语言中的#define定义常量和宏

    C语言中的define是一个预处理指令. 1.define定义常量        格式为:#define  标识符  常量  , 注意:语句末尾没有":". 2.define定义宏 ...

  4. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)

    在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...

  5. php定义常量 define vs const

    常量一旦定义就不能在改变或者取消. 在php中定义常量可以使用define()函数,在php5.3之后同样可以使用const关键字来定义常量. define 和 const的区别 语法区别 // 使用 ...

  6. PHP常量详解:define和const的区别

    常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量).常量默认大小写敏感.通常常量标识符总是大写的. 可以用define()函数来定义常量.在php5.3.0以后 ...

  7. 读书笔记之《高质量的C-C++编程》第五章节: #define 与 const 的定义常量

    常量是一种标识符,它的值在运行期间恒定不变.C 语言用 #define 来定义常量(称为宏常量).C++ 语言除了 #define (宏常量)外还可以用 const( const 常量) 来定义常量. ...

  8. UIKIT_EXTERN和define定义常量

    看过我其他的博客的人都知道,我喜欢用define定义常量,最近看了一个开源的轮子,使用UIKIT_EXTERN这个定义的常量,了解了一下,发现使用宏定义的常量会在内存中临时开辟一份内存空间,而使用UI ...

  9. c语言中常量有何作用,C语言const的用法详解,C语言常量定义详解

    有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小.为了满足这一要求,可以使用const关键字对变量加以限定: co ...

最新文章

  1. 数据蒋堂 | 人工智能中的“人工”
  2. webhook自定义服务器,GO 使用Webhook 实现github 自动化部署
  3. python selenium 进入新标签页_Python 爬虫 | 用selenium实现批改网的自动翻译
  4. yolov5 mobile 剪枝
  5. 装机必备工具(普通家庭版)
  6. CV之FR:计算机视觉之人脸识别(Face Recognition)方向的简介、代码实现、案例应用之详细攻略
  7. Jenkins + Pipeline 构建流水线发布
  8. leetcode 633. 平方数之和(双指针)
  9. 前端学习(2529):搭建中央管理
  10. TensorFlow 教程 --进阶指南--3.3可视化学习
  11. Solr连接MYSQL导入源数据生成索引
  12. angularJs模版注入的两种方式
  13. c语言调用子程序实例,C语言程序调用汇编语言子程序
  14. Linux 网络编程 TCP/UDP编程
  15. Windows 无法启动 vmwave workstation server 服务 错误1075
  16. 基于Spark的离线电影推荐
  17. 计算机技能 微信小程序,利用微信电脑最新版 反编译微信小程序 无需root
  18. c语言 发纸牌 实验报告,“21点”纸牌游戏实验报告
  19. 用友致远A6协同管理软件操作手册
  20. 安卓和ios针对小程序兼容以及小程序技术实现上本身遇到的一些问题

热门文章

  1. 【数据库bug修复】——Authentication plugin ‘caching_sha2_password‘ is not supported
  2. 史上超全halcon常见3D算子汇总(一)
  3. 总结从linux - windows 上(GCC与MSVC 2015) 移植C或者C++代码时候遇到的编译和链接问题
  4. 用户模式 内核模式 linux,linux – “内核模式”和“用户模式”硬件...
  5. 可以进行单元测试么_前端与单元测试
  6. 最新的一些开源face alignment及评价
  7. mysql字符集排序规则_Mysql 字符集及排序规则
  8. Windows下 jupyter notebook 运行multiprocessing 报错的问题与解决方法
  9. Windows Mobile,用C#更改网络连接(SSID、IP Address、Subnet Mask、Gatew... (转)
  10. 安卓APP_ 控件(4)—— ImageView