空与PHP中的虚假对0

问题描述 投票:136回答:18

有人告诉我,好的开发人员可以当场/利用NullFalse0和所有其他的好“没有”实体之间的差异。 有什么区别,特别是在PHP?它有事情做与===

php null
18个回答
210
投票

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

Null的意思是“一无所有”。该变种尚未初始化。

False的意思是“在布尔环境不是真的”。用来明确表明你正在处理的逻辑问题。

0int。无关上面休息,用于数学。

现在,什么是棘手的,它是在PHP,动态语言个个都在布尔上下文,这(在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(设置为ON)和DebugMode = True DebugMode = Null之间的差异(根本没有设置,将导致难以调试;-))。


1
投票

我认为,不良开发商找到空/ 0 /假的所有不同的用途在那里的代码。

例如,最常见的错误开发商做出一个是与功能数据的形式返回错误代码。

$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. 

这是一个糖界面的一个例子。这是在书中解释说,“调试软件开发proccess”,也有另一本书“编写正确的代码”。

这样做的问题,是char类型做出的暗示或假设。在一些编译器char类型可以是非签署。所以,即使你返回-1编译器可以返回1来代替。这些在C ++或C类编译器的假设是很难被发现。

因此,最好的办法就是不要与你的数据混合错误代码。所以,下面的函数。

Comparison Operators

现在成为

wrong code should look wrong

这意味着,无论开发商如何年轻是你的开发工作室,他或她将永远不会得到这个错误。虽然这不是在谈论代码redudancy或dependies。

因此,在一般情况下,交换布尔作为语言一流的类型是好的,我认为乔尔谈到它与他最近的PostCast。不过,尽量不要用混在你的程序配合您的数据的bool,你应该是完美的罚款。


1
投票

在PHP这取决于如果你是验证类型:

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

技术上null是char GetChar() 但是在PHP // On success return 1 // on failure return 0 bool GetChar(int &char)

( ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) && ( false !== null ) && ( false == null ) ) 是一个整数值。


1
投票

关于PHP 0x00一个有趣的事实:如果设置等于( null == 0x00 ) && ( null !== 0x00 )一个变种,这是因为如果你曾呼吁0上是相同的。

NULL实质上意味着一个变量没有分配给它的值; NULL是一个有效的布尔值,unset()是一个有效的整数值,以及PHP有NULLfalse00之间的一些相当丑陋的转换。


0
投票

空是什么,假是有点,0是(可能)32位。

没有一个PHP专家,但是在一些较为现代语言的那些不能互换。我有点怀念0和假互换,但布尔是一个实际的类型,你可以有方法和与之相关联的对象,所以这只是一个权衡。空是空虽然没有什么本质。


0
投票

好了,我不记得足够从我的PHP天回答了“===”的一部分,但对于大多数C风格的语言,NULL应在指针值的范围内使用,假作为一个布尔值和零为数值如int。 “\ 0”为字符上下文常规值。我平时也喜欢使用0.0和双精度浮点数。

所以..快速的答案是:环境。


0
投票

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

然后,事情变得更复杂的是,数据库具有空的概念,这意味着缺失或不适用,而大多数语言没有直接的方式映射为DBNull于其无效。直到最近,例如,有一个int被空和为零没有区别,但是这是可空整数改变。

对不起,让这个听起来很复杂。这只是这已经在语言哈利症结多年,直到最近,它一直没有在任何地方任何明确的决议。以前只是杂牌的东西放在一起或使空白的人或0代表数据库中,这并不总是工作得很清楚空。


0
投票

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

换言之,0可以被定义为数目,当添加到一些自然数,产率相同数量:

"0"

类似地,假是这样一个值,该值的它和任何其他值的析取的是,相同的值:

""

空是概念上完全不同的东西。根据不同的语言,有它不同的语义,但他们没有描述的“初始值”为虚假和0。没有代数空。它涉及到的变量,通常表示该变量具有在当前上下文中没有特定的值。在大多数语言中,没有对空定义的操作,这是使用空作为操作数错误。在一些语言中,有一个名为“底部”,而不是“空”的特殊价值,这是不终止计算的值的占位符。

false


0
投票

为什么“NULL”不只是在比较实例的字符串有人能向我解释?

x + 0 = x

-1
投票

与falsyness的问题来自于PHP的历史。这个问题的目标没有很好地定义标量类型。

x || False = x

PHP7严格是向前迈进了一步,但也许还不够。 I've written more extensively about the implications of NULL elsewhere.


41
投票

nullnullfalsefalse。悲哀而真实。

有没有在PHP不太统一。开发商尽量使空的意思是“未知”或“不存在”。但常出现假将作为“不存在”(例如strrpos(“失败”,“搜索”)将返回false,并且不为空)

你会经常看到,当他们已经为一些使用虚假无效使用。例如filter_input()。他们返回false如果变量无法过滤。而空,如果变量不存在(不存在意味着它也没有过滤器?那为什么还要返回null?!?)

PHP已经在功能返回数据的便利性。和ofter开发商补习班在所有类型的失败状态,而不是数据。

还有的从失败PHP检测数据(INT,STR等),任何理智的方式(假,空)

你几乎必须始终测试=== null或===假的,这取决于功能。或两者兼有,在诸如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)

17
投票

下面是一个例子:

            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 type comparisons的更多的参考。它应该给你一个清晰的认识。


5
投票

在PHP中您可以使用===和!==运营商不仅检查是否值相等,而且,如果他们的类型匹配。因此,例如:0 == falsetrue,但0 === falsefalse。这同样适用于!=!==。另外如果你使用上述运营商比较null其他两个,预计类似的结果。

现在,在PHP中,这质量值的返回有时可以0(零)的值时,通常使用,但有时可能是功能失效。在这种情况下,在PHP返回false,你必须检查使用的身份运营商===这些案件。例如,如果你正在寻找一个字符串的另一内侧的位置,你正在使用strpos(),该函数将返回数值位置,如果该字符串是在一开始就发现它可以是0,但如果字符串未找到的话,那么strpos()将返回false和你有结果打交道时考虑到这一点。

如果你在你的函数使用相同的技术,任何人都熟悉的标准PHP库会明白是怎么回事,如何检查返回值是什么是想要的或没有处理时会出现一些错误。同样实际上也适用于功能参数,可以你可以处理他们不同,这取决于他们是否是数组或字符串或什么不是,并在整个PHP采用这种方法太严重,所以大家会得到它很容易。所以我想这就是力量。


5
投票

假,空,没什么,0,未定义,等等,等等。

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

在C和C ++,qazxsw POI,qazxsw POI和POI qazxsw重载到相同的值。在C#中他们3个不同的概念。

NULLFalse通常表明缺乏价值,但通常不会具体说明原因。 0表示自然数为零且具有类型等价于1,2,3等而在支持不同的概念的null应被视为仅若干语言。

False表示非事实。它在二进制值使用。这并不意味着取消设置,也不意味着NULL。它仅仅表明两个二进制值中的一个。

没有什么能表明其价值被专门设置是没有什么这表明同样的事情无效,但意图。

未定义在一些语言指示值还没有,因为没有代码指定的实际值进行设置。


4
投票

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

这就是我要怎样做,我才发现,逻辑没有在正确的方向流动,似乎有在PHP编码一个黑洞:

概念采取托管的服务器上的域名,并确保它没有root权限级别,确定几种不同的方式来做到这一点,但我由于其他PHP函数/结构我已经做了选择不同。

反正这里是cosing的基础:

null

FINALLY阅读本主题后,我发现这个工作!

false

感谢您的这篇文章中,我现在明白了,即使它是圣诞节,它可能不是圣诞节的strops,因为它也可以是一个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"; } } falseNULL都不尽相同False


2
投票

NULL

要明确一个值转换为布尔值,使用(布尔)或(布尔)管型。 然而,在大多数情况下,铸造是unncecessary,因为一个值将如果操作,功能或控制结构需要一个boolean参数被自动转换。 当转换为布尔型,下面的值被认为是FALSE:

  • 布尔0本身
  • 整数``0(零)
  • 浮子True or False or NULL(零)
  • 空字符串,字符串PHP online documentation
  • 用零个元素的数组
  • 与零个成员变量(PHP 4只)的对象
  • 特殊类型FALSE(包括尚未设定的变量)
  • 从空标签创建的SimpleXML对象 所有其它值都被认为是0.0(包括任何资源)。

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

在另一方面,"0"NULLare不一样的东西。定期,你只需要在“等于”运算符。澄清:

TRUE

欲了解更多信息,请查看“===”页面在PHP在线文档。

希望这可以帮助。


1
投票

这些值之间的差异总是归结为详细具体的语言规则。你学的PHP什么不一定是真实的Python或Perl或C等虽然是有价值的学习规则,你正在使用的语言(S),依靠他们太多是自找麻烦。麻烦来当接下来程序员需要保持你的代码,你已经使用了一些构造,采用空与假(例如)的一些小细节的优势。您的代码应正确(相反,==)。


1
投票

null是在数据库中用来表示“没有记录”或“无信息”。所以,你可能有一个描述位字段“该用户是否希望由我们发送的电子邮件”,其中true意味着他们这样做,他们不希望被任何发送虚假手段,但空就意味着你不知道。他们可以来有关通过外部连接和诸如此类。

空的逻辑含义常常是不同的 - 在一些语言NULL不等于任何东西,所以如果(A == NULL)将永远是假的。

所以,我个人倒总是初始化一个布尔值FALSE,并初始化一个NULL看起来有点恶心(甚至在C,其中两个都只有0 ...只是一种风格的东西)。

© www.soinside.com 2019 - 2024. All rights reserved.