【发布时间】:2015-12-26 01:13:48
【问题描述】:
var_export(array(NULL, TRUE, FALSE));
结果:
array (
0 => NULL,
1 => true,
2 => false,
)
NULL 为大写,true 和 false 为小写。
我想这是有历史原因的,但我没有发现它在任何地方都有记录。
下面的实验也很有趣,它表明在内部,null、true 和 false 的“规范”拼写是小写的,这与 var_export() 的作用相反:https://3v4l.org/ggM4E
define('false', '- false -');
define('FALSE', '- FALSE -');
define('null', '- null -');
define('NULL', '- NULL -');
var_export(array(TRUE, true, FALSE, false, NULL, null));
这表明:
- define('NULL', ..) 和 define('FALSE', ..) 是允许的,但在最近的 PHP 版本中无效。
- define('null', ..) 和define('false', ..) 给出通知,但在最近的PHP版本中也没有效果。
- 在旧的 PHP 版本 (4.x) 中,'NULL' 和 'FALSE' 可以重新定义并且它确实有效。但 'null' 和 'false' 不能重新定义。
哦,只是为了完整性:在 PHP 5.x 中,如果在命名空间内,define('NULL', ..) 和 define('FALSE', ..) 实际上不会被忽略。见https://3v4l.org/JusvB。或者,如果您真的想要,您甚至可以在命名空间中覆盖“null”和“false”:https://3v4l.org/i796C
相关:Uppercase Booleans vs. Lowercase in PHP,看这个答案:https://stackoverflow.com/a/3807178/246724
【问题讨论】:
-
好吧,我怀疑这个答案可能真的很无聊。写 var_export() 的人也没多想,只是觉得 NULL 大写更好看,即使不一致。现在我们必须忍受它,否则,使用硬编码 var_export() 比较的现有单元测试将失败。也许有人有更好的答案,但恐怕没有更多的答案。
-
如果有人能证实我的这个解释/理论,最好有一些证据/参考资料,那么这将是这个问题的有效和有用的答案。这可能很无聊,但这意味着人们可以停止寻找。
-
这很无聊的答案:github.com/php/php-src/blob/master/ext/standard/var.c#L436(编辑:更新的链接,不知何故粘贴了错误的)
-
谢谢@Dukecz! git blame 把我发到这里:github.com/php/php-src/commit/… 想知道这是不是在这里介绍的,或者追溯到更远的地方。 (不知道
var_export()是从什么时候开始存在的) -
@donquixote 差不多了,这里没有什么特别的原因。如果您认为这段代码是由 C 程序员编写的,其中 (C99, stddef, stdbool) NULL 是大写字母,true/false 是小写字母,那么特定的大小写选择可能更有意义。
标签: php