首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文|PHP 定义常量,我该用define还是const?这下不迷茫了

3分钟短文|PHP 定义常量,我该用define还是const?这下不迷茫了

作者头像
程序员小助手
发布2020-06-17 11:27:40
8940
发布2020-06-17 11:27:40
举报
文章被收录于专栏:程序员小助手程序员小助手

引言

我们今天说一下 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; // BAR
echo 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 的自动索引也极为友好,写代码顺溜的不得了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 问题
  • 深层原因
  • const 的优点
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档