PHP 中的空值 vs. 假值 vs. 0
我被告知,优秀的开发人员可以发现/利用和与所有其他好的“无”实体之间的差异。
有什么区别,特别是在PHP中?它与 有关吗?Null
False
0
===
我被告知,优秀的开发人员可以发现/利用和与所有其他好的“无”实体之间的差异。
有什么区别,特别是在PHP中?它与 有关吗?Null
False
0
===
Null
表示“无”。var 尚未初始化。
False
表示“在布尔上下文中不真实”。用于明确表明您正在处理逻辑问题。
0
是一个整型
。与上面的其余部分无关,用于数学。
现在,棘手的是,在像PHP这样的动态语言中,它们都在布尔上下文中都有一个值,(在PHP中)是。False
如果你用 来测试它,它就是在测试布尔值,所以你会得到相等。如果你用 来测试它,它将测试该类型,你会得到不等式。==
===
好吧,看看函数。如果它没有找到任何东西,则返回 False,但如果它在字符串的开头发现了某些内容,则返回 0 !strrpos()
<?php
// pitfall :
if (strrpos("Hello World", "Hello")) {
// never exectuted
}
// smart move :
if (strrpos("Hello World", "Hello") !== False) {
// that works !
}
?>
当然,如果您与州打交道:
你想在(设置为off),(设置为on)和(根本没有设置,将导致硬调试;-)之间做出区分。DebugMode = False
DebugMode = True
DebugMode = Null
null
是。 是。可悲但真实。null
false
false
PHP中没有太多的一致性(尽管它在最新版本上有所改进,但有太多的向后兼容性)。尽管设计希望有一定的一致性(在这里选择的答案中概述),但当你考虑以不那么容易推理的方式使用/的方法返回时,这一切都会令人困惑。false
null
你经常会看到当他们已经在使用 false 来做某事时使用 null。例如 filter_input()。如果变量未通过筛选器,则返回 false;如果变量不存在,则返回 null(不存在意味着它也使筛选器失败?
当作者关心失败的类型时,可以互换返回false/null/string/etc的方法就是一个黑客,例如,你可以检查或者你是否关心验证失败的原因。但是,如果您不这样做,则可能是一个陷阱,因为如果他们只记得为 编写测试用例,则可能会忘记添加检查。大多数php单元测试/覆盖工具不会引起你对缺失的,未经测试的代码路径的注意!filter_input()
===false
===null
===null
===false
最后,这里有一些关于类型杂耍的乐趣。甚至不包括数组或对象。
var_dump( 0<0 ); #bool(false)
var_dump( 1<0 ); #bool(false)
var_dump( -1<0 ); #bool(true)
var_dump( false<0 ); #bool(false)
var_dump( null<0 ); #bool(false)
var_dump( ''<0 ); #bool(false)
var_dump( 'a'<0 ); #bool(false)
echo "\n";
var_dump( !0 ); #bool(true)
var_dump( !1 ); #bool(false)
var_dump( !-1 ); #bool(false)
var_dump( !false ); #bool(true)
var_dump( !null ); #bool(true)
var_dump( !'' ); #bool(true)
var_dump( !'a' ); #bool(false)
echo "\n";
var_dump( false == 0 ); #bool(true)
var_dump( false == 1 ); #bool(false)
var_dump( false == -1 ); #bool(false)
var_dump( false == false ); #bool(true)
var_dump( false == null ); #bool(true)
var_dump( false == '' ); #bool(true)
var_dump( false == 'a' ); #bool(false)
echo "\n";
var_dump( null == 0 ); #bool(true)
var_dump( null == 1 ); #bool(false)
var_dump( null == -1 ); #bool(false)
var_dump( null == false ); #bool(true)
var_dump( null == null ); #bool(true)
var_dump( null == '' ); #bool(true)
var_dump( null == 'a' ); #bool(false)
echo "\n";
$a=0; var_dump( empty($a) ); #bool(true)
$a=1; var_dump( empty($a) ); #bool(false)
$a=-1; var_dump( empty($a) ); #bool(false)
$a=false; var_dump( empty($a) ); #bool(true)
$a=null; var_dump( empty($a) ); #bool(true)
$a=''; var_dump( empty($a) ); #bool(true)
$a='a'; var_dump( empty($a)); # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)