php中 const 与define()的区别 ,选择

来自: http://stackoverflow.com/questions/2447791/define-vs-const

相同点: 两者都可以定义常量

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

const 的劣势之处:

1.const 必须被声明在top-level-scope中(顶级域)..

例如:

if(condition) {
    const FOO ='BAR';   //未定义          
}

//但是
if(condition) {
    defind('FOO','BAR'); //定义          
}

一个常用的检测常量是否定义的方式:

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

2.const 接受一个静态的标量类型(number,string,true.false,null,__FILE__,......),反之,defind()接受任何表达式。

但是,自PHP 5.6以后常量表达式也被允许在const中使用:

const BIT_5 = 1 << 5;    // PHP 5.6之后 valid ,之前 invalid
define('BIT_5', 1 << 5); // always valid

3.const 接受一个plain(?不知道翻译成啥,就是常量名称固定的意思)常量名,然而,defind()接受任何表达式作为常量名

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

4.const 定义的常量名是区分大小写的,define()允许你不区分大小写,只要将第三个参数传递true即可..

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

 

以上就是const不好的一面,现在让我们看看除非发生以上的情况,我个人推荐使用const的理由.

1.const  易读,是一个语言结构,不是一个方法,也可以在类中使用定义常量

2.const 可以在当前命名空间定义常量,但是define()不得不传递完整的命名空间名称。(一个可以是相对的,一个必须是绝对的)

namespace A\B\C;
// To define the constant A\B\C\FOO:
const FOO = 'BAR';
define('A\B\C\FOO', 'BAR');

3.const 自PHP 5.6定义常量值可以使用数组,然而define()不支持数组,但是在PHP 7 将支持这一个特性.

const FOO = [1, 2, 3];    // valid in PHP 5.6
define('FOO', [1, 2, 3]); // invalid in PHP 5.6, valid in PHP 7.0

4.const 是语言结构,被定义在编译时,define()定义在运行时,const 比defind()快

5. 最后一点,const可以在类中定义常量,而 define()不可以.

class Foo {
    const BAR = 2; // valid
}
// but
class Baz {
    define('QUX', 2); // invalid
}

 

摘要

除非你要使用表达式或在条件判断语句中定义常量,那么使用 const 是你 居家旅行,杀人灭口必备之良药。

posted @ 2016-05-08 11:30  闻香识人  阅读(419)  评论(0编辑  收藏  举报