空与PHP中的虚假对0(Null vs. False vs. 0 in PHP)

2019-06-21 16:51发布

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

Answer 1:

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

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

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

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

现在,什么是棘手的,它是在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 (设置为关闭), DebugMode = True (设为ON)和DebugMode = Null (根本没有设置,将导致难以调试;-))。



Answer 2:

null就是nullfalse就是false 。 悲哀而真实。

有没有在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)


Answer 3:

下面是一个例子:

            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。 它应该给你一个清晰的认识。



Answer 4:

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

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

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



Answer 5:

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

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

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

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

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

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

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



Answer 6:

我刚刚浪费了1/2,每天试图让无论是0,空,假的从strpos回报!

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

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

反正这里是cosing的基础:

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"; }
}

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

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

感谢您的这篇文章中,我现在明白了,即使它是圣诞节,它可能不是圣诞节假,因为它也可以是一个空的一天!

浪费调试一些简单的代码经过一天的,希望我以前知道这一点,因为本来可以用这个问题来确定,而不是去所有的地方设法得到它的工作,它并没有为假反正工作,NULL和0都不尽相同真或假或空?



Answer 7:

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



Answer 8:

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

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

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



Answer 9:

从PHP在线文档 :

“*的值显式转换为布尔型,使用(布尔)或(布尔值)管型。然而,在大多数情况下,铸造是unncecessary,因为一个值将如果操作,功能或控制结构需要一个boolean参数被自动转换当转换为布尔值,下面的值被认为是FALSE:*布尔值FALSE *整数0(零)*浮子0.0(零)*空字符串,并且字符串“0” *阵列与零个元素*与零个成员变量(PHP 4只)*特殊类型NULL(包括尚未设定的变量)的对象*从空标签所有其它值都被认为是TRUE(包括任何资源)中创建的SimpleXML对象。*“

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

在另一方面,“===”和“==”是不一样的事情。 定期,你只需要在“等于”运算符。 澄清:

$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在线文档。

希望这可以帮助。



Answer 10:

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

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

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

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

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

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

char GetChar()

现在成为

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

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

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



Answer 11:

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

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

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

0是整数值。



Answer 12:

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

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



Answer 13:

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

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



Answer 14:

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

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

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



Answer 15:

关于PHP NULL一个有趣的事实:如果你设置为NULL一个变种,它是一样的,如果你曾呼吁取消设置()就可以了。

NULL实质上意味着一个变量没有分配给它的值; 假是一个有效的布尔值,0为有效的整数值,和PHP有0之间一些相当难看转换,“0”,“”,和假。



Answer 16:

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

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

x + 0 = x

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

x || False = x

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

我约别处NULL的含义更广泛地写。



Answer 17:

在一般情况下,编程语言往往有truthy和falsy值。 什么是truthy,什么是falsy从语言中是不同的规则。

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



Answer 18:

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

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


Answer 19:

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

'*' == true -> true (string match)
'*' === true -> false (numberic match)

(int)'*' == true -> false
(string)'*' == true -> true

PHP7严格是向前迈进了一步,但也许还不够。 https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/



文章来源: Null vs. False vs. 0 in PHP
标签: php null