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



在所有PHP手册中,它都说nulltruefalse是内部值。但是,没有任何地方说明为什么可以用反斜杠写它们:nullfalsetrue

PHP 中的nullfalsetrue到底是什么?

一个常数还是对口译员来说有些黑客?

nullfalsetrue在PHP中被定义为常量。反斜杠表示全局命名空间,因此您可以像这样为这些常量指定完整的命名空间:null.这不是必需的,因为所有常量都是全局的(除了使用const定义的常量)。

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

函数和常量不需要具有完全限定名。这与必须使用其命名空间指定的类相反,例如Exception.

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

编辑

nullfalsetrue是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

如果删除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之前,falsenull不是保留关键字,所以你可以尝试这样的事情:

class TRUE {
const int = 'This is the truest of the integers';
}
var_dump(TRUE::int);

tl;dr:
访问nullfalsetrue是有效的,因为它们在内部被定义为特殊常量,而 PHP 中的所有常量都在全局命名空间中。

nulltruefalse都是文档定义的常量:

只有一个 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,您将看到TRUEFALSENULLCore中定义。

相关内容

  • 没有找到相关文章

最新更新