define()与const

define()与const

在PHP中,你什么时候使用

define('FOO', 1);

你什么时候用的

const FOO = 1;

这两者之间的主要区别是什么?


守着一只汪
浏览 479回答 3
3回答

Helenr

从PHP 5.3开始,有两种方法可以定义常量:使用const关键字或使用define()函数:const&nbsp;FOO&nbsp;=&nbsp;'BAR';define('FOO',&nbsp;'BAR');这两种方式之间的根本区别在于const在编译时定义常量,而define在运行时定义它们。这导致了大多数const的缺点。一些缺点const是:const不能用于有条件地定义常量。要定义全局常量,必须在最外层范围内使用它:if&nbsp;(...)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;FOO&nbsp;=&nbsp;'BAR';&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Invalid}//&nbsp;butif&nbsp;(...)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;define('FOO',&nbsp;'BAR');&nbsp;//&nbsp;Valid}你为什么要这样做呢?一个常见的应用是检查是否已定义常量:if&nbsp;(!defined('FOO'))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;define('FOO',&nbsp;'BAR');}const接受一个静态标量(数字,字符串或其它恒定等true,false,null,__FILE__),而define()采取的任何表达式。由于PHP 5.6也允许使用常量表达式const:const&nbsp;BIT_5&nbsp;=&nbsp;1&nbsp;<<&nbsp;5;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Valid&nbsp;since&nbsp;PHP&nbsp;5.6&nbsp;and&nbsp;invalid&nbsp;previouslydefine('BIT_5',&nbsp;1&nbsp;<<&nbsp;5);&nbsp;//&nbsp;Always&nbsp;validconst采用普通的常量名称,而define()接受任何表达式作为名称。这允许做这样的事情:for&nbsp;($i&nbsp;=&nbsp;0;&nbsp;$i&nbsp;<&nbsp;32;&nbsp;++$i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;define('BIT_'&nbsp;.&nbsp;$i,&nbsp;1&nbsp;<<&nbsp;$i);}consts始终区分大小写,而define()允许您通过传递true第三个参数来定义不区分大小写的常量:define('FOO',&nbsp;'BAR',&nbsp;true);echo&nbsp;FOO;&nbsp;//&nbsp;BARecho&nbsp;foo;&nbsp;//&nbsp;BAR所以,这是事情的坏方面。现在让我们看一下我个人总是使用的原因,const除非出现上述情况之一:const只是阅读更好。它是一种语言结构而不是函数,也与您在类中定义常量的方式一致。const作为一种语言结构,可以通过自动化工具进行静态分析。const在当前命名空间中定义一个常量,同时define()必须传递完整的命名空间名称:namespace&nbsp;A\B\C;//&nbsp;To&nbsp;define&nbsp;the&nbsp;constant&nbsp;A\B\C\FOO:const&nbsp;FOO&nbsp;=&nbsp;'BAR';define('A\B\C\FOO',&nbsp;'BAR');由于PHP 5.6&nbsp;const常量也可以是数组,define()而不支持数组。但是,PHP 7中的两种情况都支持数组。const&nbsp;FOO&nbsp;=&nbsp;[1,&nbsp;2,&nbsp;3];&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Valid&nbsp;in&nbsp;PHP&nbsp;5.6define('FOO',&nbsp;[1,&nbsp;2,&nbsp;3]);&nbsp;//&nbsp;Invalid&nbsp;in&nbsp;PHP&nbsp;5.6&nbsp;and&nbsp;valid&nbsp;in&nbsp;PHP&nbsp;7.0最后,请注意,const也可以在类或接口中使用它来定义类常量或接口常量。define不能用于此目的:class&nbsp;Foo&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;BAR&nbsp;=&nbsp;2;&nbsp;//&nbsp;Valid}//&nbsp;Butclass&nbsp;Baz&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;define('QUX',&nbsp;2);&nbsp;//&nbsp;Invalid}摘要除非你需要任何类型的条件或表达定义,否则使用consts而不是define()s - 只是为了便于阅读!

四季花海

直到PHP 5.3,const才能在全球范围内使用。你只能在课堂上使用它。当您想要设置某种常量选项或与该类相关的设置时,应该使用此选项。或许你想创造某种枚举。define可以用于相同的目的,但它只能在全局范围内使用。它应该仅用于影响整个应用程序的全局设置。良好const用法的一个例子是摆脱魔法数字。看看PDO的常量。例如,当您需要指定获取类型时,可以键入PDO::FETCH_ASSOC。如果没有使用consts,你最终会输入类似35(或任何FETCH_ASSOC定义的)的东西。这对读者没有意义。良好define用法的一个例子是指定应用程序的根路径或库的版本号。

白衣染霜花

我知道这已经得到了解答,但目前的答案都没有提到命名空间以及它如何影响常量和定义。从PHP 5.3开始,consts和define在大多数方面都是类似的。但是,仍然存在一些重要的差异:无法从表达式定义Consts。&nbsp;const FOO = 4 * 3;不起作用,但define('CONST', 4 * 3);确实如此。传递给的名称define必须包含要在该命名空间中定义的命名空间。下面的代码应说明不同之处。namespace&nbsp;foo&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;BAR&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;define('BAZ',&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;define(__NAMESPACE__&nbsp;.&nbsp;'\\BAZ',&nbsp;3);}namespace&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var_dump(get_defined_constants(true));}用户子阵列的内容将是['foo\\BAR' => 1, 'BAZ' => 2, 'foo\\BAZ' => 3]。===更新===即将推出的PHP 5.6将提供更多的灵活性const。现在,您可以根据表达式定义consts,前提是这些表达式由其他consts或文字组成。这意味着以下内容自5.6起有效:const&nbsp;FOOBAR&nbsp;=&nbsp;'foo&nbsp;'&nbsp;.&nbsp;'bar';const&nbsp;FORTY_TWO&nbsp;=&nbsp;6&nbsp;*&nbsp;9;&nbsp;//&nbsp;For&nbsp;future&nbsp;editors:&nbsp;THIS&nbsp;IS&nbsp;DELIBERATE!&nbsp;Read&nbsp;the&nbsp;answer&nbsp;comments&nbsp;below&nbsp;for&nbsp;more&nbsp;detailsconst&nbsp;ULTIMATE_ANSWER&nbsp;=&nbsp;'The&nbsp;ultimate&nbsp;answer&nbsp;to&nbsp;life,&nbsp;the&nbsp;universe&nbsp;and&nbsp;everything&nbsp;is&nbsp;'&nbsp;.&nbsp;FORTY_TWO;但是,您仍然无法根据变量或函数返回来定义constsconst&nbsp;RND&nbsp;=&nbsp;mt_rand();const&nbsp;CONSTVAR&nbsp;=&nbsp;$var;仍然会出局。
打开App,查看更多内容
随时随地看视频慕课网APP