我被告知优秀的开发者可以识别并利用 Null
、False
、0
和其他好的 "空值" 实体之间的区别。在 PHP 中具体有什么区别?这与 ===
有关吗?
我被告知优秀的开发者可以识别并利用 Null
、False
、0
和其他好的 "空值" 实体之间的区别。在 PHP 中具体有什么区别?这与 ===
有关吗?
NULL
,有一个有趣的事实:如果你将一个变量设置为 NULL
,那么它就相当于调用了 unset()
。
NULL
实际上意味着一个变量没有被赋值;false
是一个有效的布尔值,0
是一个有效的整数值,而 PHP 在 0
、"0"
、""
和 false
之间有一些相当丑陋的转换。我认为糟糕的开发者在他们的代码中找到了所有不同的null/0/false用法。
例如,开发人员最常犯的错误之一是以数据形式返回带有函数的错误代码。
// On error GetChar returns -1
int GetChar()
这是一个糖接口的示例。这在书籍“调试软件开发过程”和另一本书“编写正确代码”中有所解释。
问题在于对char类型进行的暗示或假设。在某些编译器上,char类型可以是非签名的。因此,即使您返回-1,编译器也可能返回1。这些类型的C++或C编译器假设很难发现。
相反,最好的方法是不要将错误代码与数据混合使用。因此,以下函数是最佳选择。
char GetChar()
现在变成了
// On success return 1
// on failure return 0
bool GetChar(int &char)
这意味着无论你的开发团队中有多年轻的开发人员,他们都不会犯这个错误。虽然这并不是在谈论代码中的冗余或依赖。
因此,总的来说,在语言中将bool作为第一类类型进行交换是可以的,我认为Joel在他最近的播客中谈到了这个问题。但是尽量不要在例程中混合使用布尔值和数据,那么你就应该完全没问题了。
Null 表示什么都没有,False 是一个位,而 0 可能是 32 位。
虽然我不是 PHP 专家,但在一些更现代的编程语言中,它们并不可互换。我有点想念 0 和 false 可以互换的时候,但布尔类型是一个实际的类型,你可以有与之相关联的方法和对象,所以这只是一个权衡。Null 就是 null,本质上是什么都没有。
嗯,我已经记不起来我的PHP时代有关"==="部分的答案了,但对于大多数C风格的语言,NULL应该在指针值的上下文中使用,false作为布尔值,而0则是数字值,例如int。 '\ 0'是字符上下文的惯用值。 我通常也更喜欢使用0.0表示浮点数和双精度。
所以... 快速的答案是:上下文。
False和0在概念上是相似的,即它们是同构的。0是自然数代数的初始值,而False是布尔代数的初始值。
换句话说,0可以被定义为当加到某个自然数时,得到相同数字的数字:
x + 0 = x
同样地,False 是这样一个值,使得它与任何其他值的析取结果都是该值本身:
x || False = x
Null在概念上完全不同。根据语言的不同,它们有不同的语义,但没有一个描述“初始值”像False和0一样。 Null没有代数。它涉及变量,通常用于表示变量在当前上下文中没有特定的值。在大多数语言中,没有定义Null的操作,使用Null作为操作数是错误的。在某些语言中,有一个称为“bottom”的特殊值,而不是“null”,它是计算值未终止的占位符。
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
php > var_dump((int) "NULL"); // => int(0)
php > var_dump((int) "BLA"); // => int(0)
请参阅 php.net/manual/en/language.operators.comparison.php 将字符串和资源转换为数字,进行常规数学运算。 - Sevyls关于 falsyness 的问题源自 PHP 的历史。该问题针对的是未定义良好的标量类型。
'*' == true -> true (string match)
'*' === true -> false (numberic match)
(int)'*' == true -> false
(string)'*' == true -> true
PHP7的严格性是一步向前,但可能还不够。https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/