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


引言 我们今天说一下 PHP 编程中 , 定义一个常量所使用的两种方法 。 有哪些区别 , 以及哪种是最佳实践?
PHP|3分钟短文|PHP 定义常量,我该用define还是const?这下不迷茫了
本文插图

问题 有开发者说 , 我在学习编写 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 及以上有效 【PHP|3分钟短文|PHP 定义常量,我该用define还是const?这下不迷茫了】 5 - const还可以在类或接口内使用它来定义类常量或接口常量 。 define没这功能 。
class Foo {const BAR = 2; // 完全支持}// 但是class Baz {define('QUX', 2); // 不能这么写} 写在最后 除非特别需要 , 我一般不使用 define 定义常量 , 可读性不强 。
加上框架中强制的 OOP 方式 , 使得我们自觉不自觉地形成 const 定义类常量的习惯 。 而且对于 IDE 的自动索引也极为友好 , 写代码顺溜的不得了 。
Happy coding :_)
我是 @程序员小助手, 持续分享编程知识 , 欢迎关注 。


    推荐阅读