Null vs.False vs.0在PHP中


146

有人告诉我,好的开发人员可以当场/使用之间的区别Null,并False0所有的其他的好“一无所有”的实体。
什么区别,特别是在PHP?有关系===吗?


真正弄清楚什么时候使用几乎是不可能的。我想当您使用null和何时保持一致至关重要false。我更喜欢使用null检索从方法的值时,因为我可以用isset确定的值是否返回,而不是使用empty,不会在帐户采取:false0'0'或一个空字符串,它可以在许多情况下可行的值。对我来说,这是一个凌乱的构造中最干净的解决方案。
JMRC '02

Answers:


221

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

Null意思是“ 没事 ”。变量尚未初始化。

False表示“ 在布尔上下文中不正确 ”。用于明确显示您正在处理逻辑问题。

0是一个int。与上面用于数学的其余部分无关。

现在,棘手的是,在诸如PHP之类的动态语言中,它们都在boolean上下文中有一个值(在PHP中为)False

如果使用进行测试==,那么它将测试布尔值,因此您将获得相等性。如果使用进行测试===,它将测试类型,并且您将得到不等式。

那么为什么它们有用呢?

好吧,看一下strrpos()功能。如果未找到任何内容,则返回False;如果未找到任何内容,则返回0!

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

当然,如果您处理状态:

您想在DebugMode = False(设置为off),DebugMode = True(设置为on)和DebugMode = Null(根本不设置,将导致硬调试;-) 之间有所区别。


39
关于Null的注意事项:PHP将其用作“无值”,但这不是一个好习惯。通常,Null表示不同于“无值”或“未初始化变量”的“未知值”。加1的值为1,而未知值加1的值为未知。只需记住,应用于null的任何运算符都(应该)将为null,因为对“未知值”进行的任何运算都将导致未知值。
Eli

7
请记住,这是所有意图。与现实中发生的事情无关。实际上,对于不存在的值(例如strpos,input_filter),函数可以返回false;对于失败的函数(例如input_filter),可以返回null。因此答案是,在阅读特定的功能文档后,请使用=== false和/或=== null。
gcb

5
@Eli:您从何处得知Null通常表示“未知值”。我想不出任何能做到这一点的计算机语言,也不意味着用英语,至少没有按照我能找到或听到的任何定义。也许您知道我不知道的东西?
iconoclast

2
@iconoclast-我从数据库世界中获取它。据我了解,null用作数据库中不存在或未知的数据值的占位符。参见dev.mysql.com/doc/refman/5.0/en/working-with-null.htmlen.wikipedia.org/wiki/Null_%28SQL%29
利2012年

2
Eli没错。他从语义上说,当您使用null时,您会向其他程序员发出信号,表明您不知道其中包含什么。它是未定义的。当您使用0时,表示您知道其中存在什么:一个数字。这里的数字代表没有东西。请记住,无论PHP如何威胁值,值都具有含义,值是文档的一种形式。
e-satis

45

nullnullfalsefalse。悲伤但真实。

PHP没有太多的一致性。开发人员尝试将null表示“未知”或“不存在”。但通常将False用作“不存在”(例如strrpos('fail','search')将返回false,而不是null)

当他们已经将false用于某些内容时,您经常会看到使用null的情况。例如filter_input()。如果变量未通过过滤器,则它们返回false。如果变量不存在,则返回null(不存在意味着它也使过滤器失败了吗?为什么还要返回null?!?)

php具有在函数中返回数据的便利。并且使开发人员陷入各种失败状态,而不是数据。

而且,PHP中没有健全的方法来检测故障(false,null)中的数据(int,str等)

您几乎必须始终根据功能对=== null或=== false进行测试。或两者都适用,例如filter_input()/ filter_var()

这是类型杂耍的乐趣。甚至不包括数组和对象。

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)

24
在我的观点中0 == null绝对是胡说八道,因为0是一个值,而null是一个标志,表明该变量未初始化。感谢PHP团队
mercsen

1
您两次重复了以开头的代码段var_dump( null == 0 );
Sparky

2
PHP中真正奇怪的是:null <-1 => TRUE
thehpi 2014年

1
@mercsen至少,如果PHP始终像0 == null那样运行,我会同意的。奇怪的是,0 == nullnull == [],但[] != 0
nawfal

1
strrpos('fail', 'search') will return false, and not null我认为是正确的-如果null方法未知,则strrpos返回null将像是说“我不知道字符串是否存在”而不是“字符串不存在”。
Eborbob 2015年

22

下面是一个示例:

            Comparisons of $x with PHP functions

Expression          gettype()   empty()     is_null()   isset() boolean : if($x)
$x = "";            string      TRUE        FALSE       TRUE    FALSE
$x = null;          NULL        TRUE        TRUE        FALSE   FALSE
var $x;             NULL        TRUE        TRUE        FALSE   FALSE
$x is undefined     NULL        TRUE        TRUE        FALSE   FALSE
$x = array();       array       TRUE        FALSE       TRUE    FALSE
$x = false;         boolean     TRUE        FALSE       TRUE    FALSE
$x = true;          boolean     FALSE       FALSE       TRUE    TRUE
$x = 1;             integer     FALSE       FALSE       TRUE    TRUE
$x = 42;            integer     FALSE       FALSE       TRUE    TRUE
$x = 0;             integer     TRUE        FALSE       TRUE    FALSE
$x = -1;            integer     FALSE       FALSE       TRUE    TRUE
$x = "1";           string      FALSE       FALSE       TRUE    TRUE
$x = "0";           string      TRUE        FALSE       TRUE    FALSE
$x = "-1";          string      FALSE       FALSE       TRUE    TRUE
$x = "php";         string      FALSE       FALSE       TRUE    TRUE
$x = "true";        string      FALSE       FALSE       TRUE    TRUE
$x = "false";       string      FALSE       FALSE       TRUE    TRUE

请参阅此以获取PHP 中类型比较的更多参考。它应该给您一个清晰的理解。


5

在PHP中,您可以使用===和!==运算符不仅检查值是否相等,还检查它们的类型是否匹配。因此,例如:0 == falseis true,但是0 === falseis false。这同样适用于!=!==。同样,如果您null使用提到的运算符将其与其他两个控件进行比较,则可以得到相似的结果。

现在在PHP中,返回值有时可以是0(零)时通常使用这种值的质量,但是有时可能是函数失败了。在PHP的这种情况下,您需要返回,false并且必须使用Identity运算符检查这些情况===。例如,如果您正在搜索一个字符串在另一个字符串中的位置,并且正在使用strpos(),则此函数将返回数字位置(如果在字符串的最开始处找到该字符串,则为0,但是如果找不到该字符串,则返回0)全部,然后strpos()将返回false,您在处理结果时必须考虑到这一点。

如果您将在函数中使用相同的技术,那么熟悉标准PHP库的任何人都将了解正在发生的事情以及如何检查返回的值是所需的值还是在处理过程中发生了一些错误。实际上,函数参数也是如此,您可以根据它们是数组还是字符串还是什么字符串来不同地对其进行不同的处理,并且该技术在PHP中也大量使用,因此每个人都可以很容易地获得它。所以我想这就是力量。


5

False,Null,Nothing,0,Undefined等,等等。

这些中的每一个都具有与实际概念相关的特定含义。有时,多个含义会被重载为一个关键字或值。

CC ++NULLFalse0被重载为相同的值。在C#中,它们是3个不同的概念。

nullNULL通常表示缺乏价值,但通常不指定原因。 0表示自然数零,并且与1、2、3等具有类型等价性并且在支持单独概念的语言中,NULL仅应将其视为数字。

表示不真实。它用于二进制值。这并不意味着未设置,也不意味着0。它只是指示两个二进制值之一。

没有什么可以表明该值被专门设置为无,这表示与null相同,只是有目的。

在某些语言中,未定义表示尚未设置该值,因为没有代码指定实际值。


也许有趣,但是根本不讨论PHP。
布拉德

4

我刚刚浪费了1/2,每天试图让无论是0nullfalse从回报strops

在发现逻辑没有朝着正确的方向流动之前,这就是我想做的所有事情,似乎php编码中存在一个黑洞:

概念取一个托管在服务器上的域名,并确保它不是根级别,可以通过几种不同的方法来完成此操作,但是由于我已经完成了其他php函数/构造,因此我选择了不同的方法。

无论如何,这里是计算的基础:

if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ()) 
{ 
    do this 
} else {
    or that
}

{
echo strpos(mydomain.co.uk, mydomain);  

if ( strpos(mydomain, xmas) == null ) 
    {
        echo "\n1 is null"; 
    }

if ( (strpos(mydomain.co.uk, mydomain)) == 0 ) 
    {
        echo "\n2 is 0"; 
    } else {
        echo "\n2 Something is WRONG"; 
    }

if ( (mydomain.co.uk, mydomain)) != 0 ) 
    {
        echo "\n3 is 0"; 
    } else {
        echo "\n3 it is not 0"; 
    }

if ( (mydomain.co.uk, mydomain)) == null ) 
    {
        echo "\n4 is null"; 
    } else {
        echo "\n4 Something is WRONG"; 
    }
}

最终,在阅读了本主题之后,我发现这是可行的!!!

{
if ((mydomain.co.uk, mydomain)) !== false ) 
    {
        echo "\n5 is True"; 
    } else {
        echo "\n5 is False"; 
    }
}

感谢本文,我现在知道即使是圣诞节,也可能不是圣诞节false,因为它也可能是NULL一天!

在浪费了一天的时间调试一些简单的代码之后,希望我以前已经知道这一点,因为我能够识别出问题,而不是四处寻找使它正常工作的方法。它没有工作,因为FalseNULL0不都是一样True or False or NULL


2

PHP在线文档中

要将值显式转换为布尔值,请使用(bool)或(boolean)强制类型转换。
但是,在大多数情况下,强制转换是不必要的,因为如果操作员,函数或控制结构需要布尔参数,则将自动转换值。
转换为布尔值时,以下值为FALSE:

  • 布尔值FALSE本身
  • 整数``0(零)
  • 浮点数0.0(零)
  • 空字符串和字符串 "0"
  • 零元素数组
  • 成员变量为零的对象(仅PHP 4)
  • 特殊类型NULL(包括未设置的变量)
  • 从空标记创建的SimpleXML对象
    会考虑所有其他值TRUE(包括任何资源)。

因此,在大多数情况下,都是相同的。

另一方面,the ===和the ==是不同的东西。通常,您只需要“等于”运算符。澄清:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

有关更多信息,请选中“ 比较运算符 PHP在线文档中 ”页面。

希望这可以帮助。


1

这些值之间的差异始终归因于特定于语言的详细规则。您为PHP学习的内容不一定适用于Python,Perl或C等。虽然学习所用语言的规则很有价值,但过多地依赖它们会带来麻烦。当下一个程序员需要维护您的代码并且您使用了一些利用Null vs. False的细节的麻烦时(例如),麻烦就来了。您的代码应该看起来正确(相反,错误的代码应该看起来错误)。


1

在数据库中使用Null表示“无记录”或“无信息”。因此,您可能会有一个位域来描述“此用户是否要由我们发送电子邮件”,其中True表示他们愿意,False表示他们不希望发送任何邮件,但Null表示您不想发送任何电子邮件。不知道。它们可以通过外部联接等来实现。

Null的逻辑含义通常是不同的-在某些语言中,NULL不等于任何东西,因此if(a == NULL)始终为false。

因此,就我个人而言,我总是将布尔值初始化为FALSE,而将一个布尔值初始化为NULL看起来有些棘手(即使在C中,两者都只是0,这只是一个样式)。


1

我认为糟糕的开发人员会在代码中找到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在最近的演讲中谈到了这一点。但是,请不要在例程中使用混合匹配布尔值与数据的方式,您应该会很好。


1

在PHP中,这取决于您是否要验证类型:

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

从技术上讲null 0x00在PHP中是( null == 0x00 ) && ( null !== 0x00 )

0 是一个整数值。


1

关于NULLPHP的一个有趣的事实:如果将var设置为NULL,则与调用一样。unset()它相同。

NULL本质上是指变量没有赋值;false是一个有效的布尔值,0是一个有效的整数值,和PHP之间有一些非常丑陋的转换0"0""",和false


0

Null什么都不是,False是一位,0(大概)是32位。

不是PHP专家,但是在某些更现代的语言中,它们是不可互换的。我有点想念0和false可以互换,但由于boolean是实际类型,因此您可以将方法和对象与之关联,所以这只是一个折衷。Null是null,但是本质上没有任何东西。


0

好吧,我从PHP时代起就记不清回答“ ===”部分了,但是对于大多数C风格的语言,应在指针值的上下文中使用NULL,将false用作布尔值,将零用作a值。数值,例如int。'\ 0'是字符上下文的常规值。我通常也更喜欢将0.0用于浮点数和双打。

所以..快速的答案是:上下文。


0

在几乎所有现代语言中,null在逻辑上是指没有值或未初始化的变量的指针(或引用)。0是零的整数值,而false是false的布尔值。为了使事情变得复杂,例如,在C中,null,0和false都以完全相同的方式表示。我不知道它如何在PHP中工作。

然后,使事情更加复杂的是,数据库具有null的概念,这意味着丢失或不适用,并且大多数语言都没有直接的方法将DBNull映射为其null。例如,直到最近,int还是null还是零之间没有区别,但是使用nullable的int进行了更改。

很抱歉,这听起来很复杂。只是多年来,这一直是语言的绊脚石,直到最近,还没有任何明确的解决方案。人们过去常常将所有内容放在一起或者将其设为空白或0表示数据库中的空值,但这并不总是能很好地工作。


0

False和0在概念上相似,即它们是同构的。0是自然数代数的初始值,而False是布尔代数的初始值。

换句话说,可以将0定义为一个数字,当将其添加到某个自然数时,它会产生相同的数字:

x + 0 = x

类似地,False是一个值,以使其与任何其他值的析取值都相同:

x || False = x

Null在概念上完全不同。取决于语言,它有不同的语义,但是没有一个描述“初始值”为False和0。Null没有代数。它与变量有关,通常表示变量在当前上下文中没有特定值。在大多数语言中,没有在Null上定义任何操作,并且将Null用作操作数是错误的。在某些语言中,有一个特殊的值叫做“ bottom”而不是“ null”,它是不终止的计算值的占位符。

我已经在其他地方写了更多有关NULL含义的文章。


1
offtopic,false == 0被完全阻止。甚至更多与PHP返回数据或功能失败。请参见mysql_insert_id的返回。“”“成功完成前一个查询为AUTO_INCREMENT列生成的ID;如果前一个查询未生成AUTO_INCREMENT值,则为0;如果未建立MySQL连接,则为FALSE。”“”基本上,它可以返回A)id, B)零,C)假...现在,如果这是表中的第一项,则id将为零!所以所有三个值都相同!开发人员如何理解三种零类型?...而且我同意您在null上的帖子。
gcb

0

有人可以向我解释为什么'NULL'不仅仅是比较实例中的字符串?

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!

1
因为PHP在内部强制转换为整数类型,然后进行比较。php > var_dump((int) "NULL"); // => int(0) php > var_dump((int) "BLA"); // => int(0)参见php.net/manual/en/language.operators.comparison.php将字符串和资源转换为数字,通常是数学
Sevyls,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.