在所有PHP手册中,它都说null
、true
和false
是内部值。但是,没有任何地方说明为什么可以用反斜杠写它们:null
、false
、true
。
PHP 中的null
、false
和true
到底是什么?
一个常数还是对口译员来说有些黑客?
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
如果删除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);
更有趣的是,它们实际上被视为特殊常量,不能由用户重新定义(其他预定义常量可以使用const
在自己的命名空间中重新定义)。因此,我认为,出于所有意图和目的,您不仅可以将这 3 个视为常量,还可以将类似于保留关键字的特殊值视为常量。目前,它们仍然在 PHP 中作为不区分大小写的黑客实现,但正如 @NikiC 提交中的注释所述:">将来我们可能会将它们从常量转换为保留关键字。
有趣的事实:在 PHP 7true
之前,false
和null
不是保留关键字,所以你可以尝试这样的事情:
class TRUE {
const int = 'This is the truest of the integers';
}
var_dump(TRUE::int);
tl;dr:
访问null
、false
和true
是有效的,因为它们在内部被定义为特殊常量,而 PHP 中的所有常量都在全局命名空间中。
null
、true
和false
都是文档定义的常量:
只有一个 null 类型的值,即不区分大小写的常量 NULL。
和
若要指定布尔文本,请使用常量 TRUE 或 FALSE。两者都不区分大小写。
当你把放在它们之前时,它会强制 PHP 在全局命名空间中查找。
同样,您可以通过定义自己的常量来测试这一点:
define('TEST', 'true');
var_dump(TEST); // string(4) "true"
命名空间常量的另一个示例:
namespace Test {
const A = 'A';
}
namespace { // Global namespace
const A = 'B';
echo A . PHP_EOL; // B
echo TestA . PHP_EOL; // A
}
如果你在get_defined_constants
中查看分类参数设置为true
,您将看到TRUE
、FALSE
和NULL
在Core
中定义。