为什么null可以用反斜杠写?

Kar*_*v1k 4 php null namespaces constants

在所有的PHP手册,它说nulltruefalse有内在价值。然而,无处没有说为什么他们可以用反斜杠写:\null\false\true

究竟是什么nullfalse以及true在PHP?

一个常量,还是对翻译的帮助?

Dha*_*man 5

nullfalse并且true在PHP中定义为常量。反斜杠表示全局名称空间,因此您可以为这些常量指定完整的名称空间,如下所示:\null。这是没有必要的,因为所有常量都是全局常量(使用定义的常量const除外)。

像超全局变量一样,常量的范围也是全局的。您可以在脚本中的任何位置访问常量,而无需考虑范围。有关范围的更多信息,请阅读有关变量范围的手册部分。- 常量PHP手册

函数和常量不需要完全限定的名称。这与必须使用其名称空间(例如)指定的类相反\Exception

对于函数和常量,如果没有命名空间的函数或常量,PHP将退回到全局函数或常量。- 关于名称空间回退的PHP手册

编辑

nullfalse并且true是在PHP非常特殊的常量。它们是唯一仍然明确“不区分大小写”的代码。为什么我把它放在引号的原因是因为实际的常量名称定义为NULLFALSETRUE,除了...它实际上不是。它是小写的:

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 truefalsenull没有保留关键字,所以你可以尝试这样的事情

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中所有的常量是在全局命名空间。