PHP 中的空值 vs. 假值 vs. 0

2022-08-30 06:43:05

我被告知,优秀的开发人员可以发现/利用和与所有其他好的“无”实体之间的差异。
有什么区别,特别是在PHP中?它与 有关吗?NullFalse0===


答案 1

它是特定于语言的,但在PHP中:

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 = FalseDebugMode = TrueDebugMode = Null


答案 2

null是。 是。可悲但真实。nullfalsefalse

PHP中没有太多的一致性(尽管它在最新版本上有所改进,但有太多的向后兼容性)。尽管设计希望有一定的一致性(在这里选择的答案中概述),但当你考虑以不那么容易推理的方式使用/的方法返回时,这一切都会令人困惑。falsenull

你经常会看到当他们已经在使用 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)

推荐