在PHP中为零与虚假与0

我被告知,优秀的开发人员可以发现/利用“ Null与“ False与“ 0以及所有其他的“无”实体之间的区别。
有什么区别,特别是在PHP? 它与===有什么关系?

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

Null意味着“ 没有 ”。 该var尚未初始化。

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

0是一个int 。 与以上其余部分无关,用于math。

现在,棘手的是,在像PHP这样的dynamic语言中,它们都在布尔上下文中有一个值 (在PHP中)是False

如果你用==testing它,它testing的布尔值,所以你会得到平等。 如果你用===testing它,它会testing这个types,你会得到不平等。

那么他们为什么有用呢?

那么看看strrpos()函数。 如果它没有find任何东西,它将返回False,但是如果它在string的开始处发现了某些东西,则返回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 (根本不设置,将导致硬debugging;-))之间做出区别。

nullnullfalsefalse 。 可悲但真实。

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

当他们已经使用false为某些东西的时候,你经常会看到null被使用。 例如filter_input()。 如果variables没有通过filter,它们将返回false。 如果variables不存在,则为null(不存在意味着它也失败了filter,为什么甚至返回null?!?)

PHP有function返回数据的方便。 而开发人员则以各种失败状态而不是数据来填充。

在PHP中没有用于检测失败的数据(int,str等)的方法(false,null)

你几乎必须总是testing=== null或=== false,这取决于函数。 或者两者兼而有之,例如filter_input()/ filter_var()

这里有一些types杂耍的乐趣。 甚至不包括数组和对象。

 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) 

下面是一个例子:

  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中的types比较更多的参考,并会给你清楚的理解。

在PHP中,您可以使用===和!==运算符来检查不仅值是否相等,而且它们的types是否匹配。 所以例如: 0 == falsetrue ,但是0 === falsefalse!=!== 。 另外,如果您使用提到的运算符将null与其他两个运算符进行比较,则会得到类似的结果

现在在PHP中,通常在返回有时可能为0 (零)的值时使用这种值的质量,但有时可能是该函数失败。 在这种情况下,你返回false ,你必须使用身份运算符===检查这些情况。 例如,如果您正在search另一个string的位置,而您正在使用strpos() ,则该函数将返回数字位置,如果string在最开始被find,则该位置可以是0,但是如果string是没有find,那么strpos()将返回false并且在处理结果时必须考虑到这一点。

如果你将在你的函数中使用相同的技术,任何熟悉标准PHP库的人都会理解正在进行的操作,以及如何检查返回值是否是在处理过程中想要的或者发生了什么错误。 实际上对于函数参数来说也是一样的,你可以根据数组或者string的不同来处理它们,而且这个技术在整个PHP中也是非常重要的,所以每个人都可以很容易地得到它。 所以我想这就是力量。

假,无,无,0,未定义

其中每一个都有与实际概念相关的特定含义。 有时多重意义被重载到单个关键字或值中。

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

nullNULL通常表示缺less值,但通常不会指定原因。 0表示自然数零,并且具有与1,2,3等的types等同性并且在支持NULL单独概念的语言中应该仅被视为一个数字。

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

没有任何东西可以表明这个值是专门设置为与null无关,而是意图的。

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

我一天只浪费了1/2,试图从strpos中得到0,null,虚假的回报!

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

概念采取服务器上托pipe的域名,并确保它不是根级别,好几种不同的方式来做到这一点,但我select了不同的,由于我已经做了其他的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"; } } 

感谢这篇文章,我现在明白,即使是圣诞节,圣诞节也不是假的,也可能是空的一天!

在浪费了一整天的时间来debugging一些简单的代码之后,我希望以前知道这一点,就像能够认识到这个问题一样,而不是一直到那个地方去试试它的工作方式。 ,Null和0是不是全部相同True或False或null?

这些值之间的差异总是归结为详细的语言特定规则。 你学习的PHP不一定适用于Python,Perl,或者C等。虽然学习你正在使用的语言的规则是很有价值的,但是依赖它们太麻烦了, 。 当下一个程序员需要维护你的代码时,你会遇到麻烦,并且你已经使用了一些利用了Null和False的一些细节的构造(例如)。 你的代码应该看起来是正确的(相反, 错误的代码应该看起来错了 )。

数据库中使用空值来表示“无logging”或“无信息”。 所以你可能有一个字段,描述“这个用户是否希望被我们发送电子邮件”,其中True表示他们这样做,False意味着他们不想被发送任何东西,但是Null意味着你不会发送邮件,不知道。 他们可以通过外部连接等来实现。

Null的逻辑含义通常是不同的 – 在某些语言中,NULL不等于任何东西,所以如果(a == NULL)将始终为假。

因此,我个人总是将布尔值初始化为FALSE,初始化为NULL会显得有些((即使在C中,两者都只是0 …只是一种风格的东西)。

我认为糟糕的开发人员在代码中发现了null / 0 / false的所有不同用法。

例如,开发人员最常犯的错误之一就是以函数forms返回数据forms的错误代码。

 // On error GetChar returns -1 int GetChar() 

这是一个糖界面的例子。 这在“debugging软件开发过程”一书以及另外一本书“编写正确的代码”中都有说明。

这个问题是对chartypes的暗示或假设。 在一些编译器上,chartypes可以是非签名的。 所以即使你返回-1,编译器也可以返回1。 C ++或C中的这些编译器假设很难被发现。

相反,最好的方法是不要将错误代码与您的数据混合在一起。 所以下面的function。

 char GetChar() 

现在变成了

 // On success return 1 // on failure return 0 bool GetChar(int &char) 

这意味着无论开发商在开发商店有多年轻,他都不会弄错。 虽然这不是在谈论减less或代码依赖。

所以一般来说,将bool换成语言中的第一类types是可以的,我认为joel在他最近的postcast中谈到了这一点。 但是尽量不要在你的例程中使用混合和匹配bools和你的数据,你应该很好。

在PHP中,取决于您是否正在validationtypes:

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

技术上,null是0x00但是在PHP ( null == 0x00 ) && ( null !== 0x00 )

0是一个整数值。

Null没有任何意义,False是有点,0(可能)是32位。

不是一个PHP专家,但在一些更现代的语言,这些是不可互换的。 我有点想念0和假可互换,但布尔是一个实际types,你可以有方法和对象相关联,所以这只是一个折衷。 空值虽然为空,但本质上没有任何东西。

那么,我记不起我的PHP日来回答“===”的一部分,但是对于大多数C语言风格的语言,应该在指针值的上下文中使用NULL,作为布尔值使用NULL,作为数值,如int。 '\ 0'是字符上下文的习惯值。 我通常也喜欢使用浮动和双打0.0。

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

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

然后,更复杂的事情是,数据库有一个空的概念,这意味着缺失或不适用,大多数语言没有一个直接的方式来映射一个DBNULL为null。 直到最近,例如int和null之间没有任何区别,但是可以用空的int来改变。

对不起,这听起来很复杂。 这只是多年来语言的一个难题,直到最近,它在任何地方都没有任何明确的解决scheme。 过去人们只是把事情弄得一团糟或者空白,或者0代表数据库中的空值,这并不总是工作得很好。

从PHP在线文档 :

“*要显式地将一个值转换为布尔值,可以使用(bool)或(boolean)强制转换,但是在大多数情况下,强制转换是不必要的,因为如果一个操作符,函数或控制结构需要一个布尔参数。当转换为布尔值时,以下值被认为是FALSE:*布尔型FALSE本身*整数0(零)*浮点型0.0(零)*空string,string“0”*零元素数组*一个具有零成员variables的对象(仅适用于PHP 4)*特殊typesNULL(包括未设置variables)*由空标记创build的SimpleXML对象每个其他值都被视为TRUE(包括任何资源)*“

所以,在大多数情况下,这是一样的。

另一方面,“===”和“==”不是一回事。 通常,你只需要“等号”运算符。 澄清:

 $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在线文档中的“ 比较运算符 ”页面。

希望这可以帮助。

一个关于PHP中的NULL的有趣事实:如果你设置一个var等于NULL,就像你调用了unset()一样。

NULL实质上是指一个variables没有赋值给它; false是一个有效的布尔值,0是一个有效的整数值,并且PHP在0,“0”,“”和false之间有一些相当丑陋的转换。

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

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

 x + 0 = x 

同样的,False是一个值,这个值和其他任何值的分离都是相同的值:

 x || False = x 

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

我在其他地方写了更多关于NULL的含义。

一般来说,编程语言往往具有真实和谬误的价值。 什么是真理和什么是谬误的规则因语言而异。

http://www.isolani.co.uk/blog/javascript/TruthyFalsyAndTypeCasting