Kar*_*v1k 4 php null namespaces constants
在所有的PHP手册,它说null,true和false有内在价值。然而,无处没有说为什么他们可以用反斜杠写:\null,\false,\true。
究竟是什么null,false以及true在PHP?
一个常量,还是对翻译的帮助?
null,false并且true在PHP中定义为常量。反斜杠表示全局名称空间,因此您可以为这些常量指定完整的名称空间,如下所示:\null。这是没有必要的,因为所有常量都是全局常量(使用定义的常量const除外)。
像超全局变量一样,常量的范围也是全局的。您可以在脚本中的任何位置访问常量,而无需考虑范围。有关范围的更多信息,请阅读有关变量范围的手册部分。- 常量PHP手册
函数和常量不需要完全限定的名称。这与必须使用其名称空间(例如)指定的类相反\Exception。
对于函数和常量,如果没有命名空间的函数或常量,PHP将退回到全局函数或常量。- 关于名称空间回退的PHP手册
null,false并且true是在PHP非常特殊的常量。它们是唯一仍然明确“不区分大小写”的代码。为什么我把它放在引号的原因是因为实际的常量名称定义为NULL,FALSE,TRUE,除了...它实际上不是。它是小写的:
define('TRUE', 'foo'); // works
define('True', 'bar'); // works too, even in combination with the first one
define('true', 'abc'); // Notice: Constant true already defined
var_dump(constant('TRUE')); // string 'foo'
var_dump(constant('True')); // string 'bar'
var_dump(constant('true')); // boolean true
Run Code Online (Sandbox Code Playgroud)
如果删除define()-s,那么即使使用,所有常量也会指向布尔值constant('True')。- https://ideone.com/CZSwiX
PHP手册指出:
要指定布尔文字,请使用常量TRUE或FALSE。两者都不区分大小写。
然后,您可能会问自己,这些常数的值是多少?如果执行var_dump(TRUE);,结果将是bool(true),如果执行,结果echo true;将打印出来1。它们在PHP源代码中的定义是什么?这是答案:
REGISTER_MAIN_BOOL_CONSTANT("TRUE", 1, CONST_PERSISTENT);
REGISTER_MAIN_BOOL_CONSTANT("FALSE", 0, CONST_PERSISTENT);
REGISTER_MAIN_NULL_CONSTANT("NULL", CONST_PERSISTENT);
Run Code Online (Sandbox Code Playgroud)
更有趣的是,它们实际上被视为特殊常量,并且不能由用户重新定义(其他预定义常量可以使用来在其自己的名称空间中重新定义const)。因此,我认为,出于所有意图和目的,您可以将这3个不仅视为常量,而且还应将其视为类似于保留关键字的特殊值。目前,它们仍被实现为PHP中不区分大小写的hack,但正如@NikiC 提交的注释中指出:“将来,我们可能会将它们从常量转换为保留关键字。”
有趣的事实:直到PHP 7 true,false并null没有保留关键字,所以你可以尝试这样的事情:
define('TRUE', 'foo'); // works
define('True', 'bar'); // works too, even in combination with the first one
define('true', 'abc'); // Notice: Constant true already defined
var_dump(constant('TRUE')); // string 'foo'
var_dump(constant('True')); // string 'bar'
var_dump(constant('true')); // boolean true
Run Code Online (Sandbox Code Playgroud)
TL;博士:
访问\null,\false和\true作品,因为它们被内部定义为特殊常量和PHP中所有的常量是在全局命名空间。