问题

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

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

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

深层缘故原由

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

phpconst3分钟短文|PHP 界说常量我该用define照样const这下不渺茫了 Angular

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; // BARconst 的优点

除了上一节所说的 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 :_)

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