在所有PHP手册中,它都说null
,true
和false
是内部值。然而,它没有说明为什么他们可以用反斜杠写:\null
,\false
,\true
。
PHP中的null
,false
和true
究竟是什么?
一个常数还是他们对翻译有点破解?
null
,false
和true
在PHP中定义为常量。反斜杠意味着global namespace,所以你可以像这样指定这些常量的完整命名空间:\null
。这不是必需的,因为所有常量都是全局的(除了使用const
定义的常量)。
像超长球一样,常数的范围是全局的。您可以在脚本中的任何位置访问常量,而不考虑范围。有关范围的更多信息,请阅读有关变量范围的手册部分。 - PHP Manual on Constants
函数和常量不需要具有完全限定名称。这与classes which must be specified with their namespace相反,例如\Exception
。
对于函数和常量,如果不存在命名空间函数或常量,PHP将回退到全局函数或常量。 - PHP Manual on namespace fallback
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源代码中定义了什么? Here is the answer:
REGISTER_MAIN_BOOL_CONSTANT("TRUE", 1, CONST_PERSISTENT);
REGISTER_MAIN_BOOL_CONSTANT("FALSE", 0, CONST_PERSISTENT);
REGISTER_MAIN_NULL_CONSTANT("NULL", CONST_PERSISTENT);
更有趣的是,它们实际上被视为special constants,不能由用户重新定义(其他预定义的常量可以使用const
在它们自己的命名空间中重新定义)。因此,我认为,对于所有意图和目的,您可以将这3个不仅仅视为常量,而是将特殊值视为保留关键字。目前它们仍被实现为PHP中不区分大小写的hack,但正如@NikiC在commit中的评论所述:“将来我们可能会将它们从常量转换为保留关键字。”
有趣的事实:直到PHP 7 true
,false
和null
都没有保留关键字,所以你可以try something like this:
class TRUE {
const int = 'This is the truest of the integers';
}
var_dump(TRUE::int);
TL;博士:
访问\null
,\false
和\true
是有效的,因为它们在内部定义为特殊常量,PHP中的所有常量都在全局命名空间中。
只有一个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 Test\A . PHP_EOL; // A
}
如果你看看get_defined_constants
的分类参数设置为true
,你会看到在TRUE
中定义的FALSE
,NULL
和Core
。