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

问题描述 投票:4回答:2

在所有PHP手册中,它都说nulltruefalse是内部值。然而,它没有说明为什么他们可以用反斜杠写:\null\false\true

PHP中的nullfalsetrue究竟是什么?

一个常数还是他们对翻译有点破解?

php null namespaces constants
2个回答
5
投票

nullfalsetrue在PHP中定义为常量。反斜杠意味着global namespace,所以你可以像这样指定这些常量的完整命名空间:\null。这不是必需的,因为所有常量都是全局的(除了使用const定义的常量)。

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

函数和常量不需要具有完全限定名称。这与classes which must be specified with their namespace相反,例如\Exception

对于函数和常量,如果不存在命名空间函数或常量,PHP将回退到全局函数或常量。 - PHP Manual on namespace fallback

EDIT

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源代码中定义了什么? 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 truefalsenull都没有保留关键字,所以你可以try something like this

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

TL;博士: 访问\null\false\true是有效的,因为它们在内部定义为特殊常量,PHP中的所有常量都在全局命名空间中。


4
投票

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 Test\A . PHP_EOL; // A
}

如果你看看get_defined_constants的分类参数设置为true,你会看到在TRUE中定义的FALSENULLCore

© www.soinside.com 2019 - 2024. All rights reserved.