有人告诉我,好的开发人员可以当场/使用之间的区别Null
,并False
与0
所有的其他的好“一无所有”的实体。
什么是区别,特别是在PHP?有关系===
吗?
有人告诉我,好的开发人员可以当场/使用之间的区别Null
,并False
与0
所有的其他的好“一无所有”的实体。
什么是区别,特别是在PHP?有关系===
吗?
Answers:
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
(根本不设置,将导致硬调试;-) 之间有所区别。
null
是null
。false
是false
。悲伤但真实。
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)
var_dump( null == 0 );
。
0 == null
和null == []
,但[] != 0
!
strrpos('fail', 'search') will return false, and not null
我认为是正确的-如果null
方法未知,则strrpos
返回null
将像是说“我不知道字符串是否存在”而不是“字符串不存在”。
下面是一个示例:
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 中类型比较的更多参考。它应该给您一个清晰的理解。
在PHP中,您可以使用===和!==运算符不仅检查值是否相等,还检查它们的类型是否匹配。因此,例如:0 == false
is true
,但是0 === false
is false
。这同样适用于!=
对!==
。同样,如果您null
使用提到的运算符将其与其他两个控件进行比较,则可以得到相似的结果。
现在在PHP中,返回值有时可以是0
(零)时通常使用这种值的质量,但是有时可能是函数失败了。在PHP的这种情况下,您需要返回,false
并且必须使用Identity运算符检查这些情况===
。例如,如果您正在搜索一个字符串在另一个字符串中的位置,并且正在使用strpos()
,则此函数将返回数字位置(如果在字符串的最开始处找到该字符串,则为0,但是如果找不到该字符串,则返回0)全部,然后strpos()
将返回false
,您在处理结果时必须考虑到这一点。
如果您将在函数中使用相同的技术,那么熟悉标准PHP库的任何人都将了解正在发生的事情以及如何检查返回的值是所需的值还是在处理过程中发生了一些错误。实际上,函数参数也是如此,您可以根据它们是数组还是字符串还是什么字符串来不同地对其进行不同的处理,并且该技术在PHP中也大量使用,因此每个人都可以很容易地获得它。所以我想这就是力量。
False,Null,Nothing,0,Undefined等,等等。
这些中的每一个都具有与实际概念相关的特定含义。有时,多个含义会被重载为一个关键字或值。
在C和C ++中NULL
,False
和0
被重载为相同的值。在C#中,它们是3个不同的概念。
null
或NULL
通常表示缺乏价值,但通常不指定原因。
0
表示自然数零,并且与1、2、3等具有类型等价性,并且在支持单独概念的语言中,NULL
仅应将其视为数字。
假表示不真实。它用于二进制值。这并不意味着未设置,也不意味着0
。它只是指示两个二进制值之一。
没有什么可以表明该值被专门设置为无,这表示与null相同,只是有目的。
在某些语言中,未定义表示尚未设置该值,因为没有代码指定实际值。
我刚刚浪费了1/2,每天试图让无论是0
,null
,false
从回报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
一天!
在浪费了一天的时间调试一些简单的代码之后,希望我以前已经知道这一点,因为我能够识别出问题,而不是四处寻找使它正常工作的方法。它没有工作,因为False
,NULL
和0
不都是一样True or False or NULL
?
从PHP在线文档中:
要将值显式转换为布尔值,请使用(bool)或(boolean)强制类型转换。
但是,在大多数情况下,强制转换是不必要的,因为如果操作员,函数或控制结构需要布尔参数,则将自动转换值。
转换为布尔值时,以下值为FALSE:
FALSE
本身 0.0
(零) "0"
NULL
(包括未设置的变量) 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在线文档中 ”页面。
希望这可以帮助。
这些值之间的差异始终归因于特定于语言的详细规则。您为PHP学习的内容不一定适用于Python,Perl或C等。虽然学习所用语言的规则很有价值,但过多地依赖它们会带来麻烦。当下一个程序员需要维护您的代码并且您使用了一些利用Null vs. False的细节的麻烦时(例如),麻烦就来了。您的代码应该看起来正确(相反,错误的代码应该看起来错误)。
我认为糟糕的开发人员会在代码中找到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在最近的演讲中谈到了这一点。但是,请不要在例程中使用混合匹配布尔值与数据的方式,您应该会很好。
在PHP中,这取决于您是否要验证类型:
(
( 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和false可以互换,但由于boolean是实际类型,因此您可以将方法和对象与之关联,所以这只是一个折衷。Null是null,但是本质上没有任何东西。
在几乎所有现代语言中,null在逻辑上是指没有值或未初始化的变量的指针(或引用)。0是零的整数值,而false是false的布尔值。为了使事情变得复杂,例如,在C中,null,0和false都以完全相同的方式表示。我不知道它如何在PHP中工作。
然后,使事情更加复杂的是,数据库具有null的概念,这意味着丢失或不适用,并且大多数语言都没有直接的方法将DBNull映射为其null。例如,直到最近,int还是null还是零之间没有区别,但是使用nullable的int进行了更改。
很抱歉,这听起来很复杂。只是多年来,这一直是语言的绊脚石,直到最近,还没有任何明确的解决方案。人们过去常常将所有内容放在一起或者将其设为空白或0表示数据库中的空值,但这并不总是能很好地工作。
False和0在概念上相似,即它们是同构的。0是自然数代数的初始值,而False是布尔代数的初始值。
换句话说,可以将0定义为一个数字,当将其添加到某个自然数时,它会产生相同的数字:
x + 0 = x
类似地,False是一个值,以使其与任何其他值的析取值都相同:
x || False = x
Null在概念上完全不同。取决于语言,它有不同的语义,但是没有一个描述“初始值”为False和0。Null没有代数。它与变量有关,通常表示变量在当前上下文中没有特定值。在大多数语言中,没有在Null上定义任何操作,并且将Null用作操作数是错误的。在某些语言中,有一个特殊的值叫做“ bottom”而不是“ null”,它是不终止的计算值的占位符。
虚假的问题来自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
和何时保持一致至关重要false
。我更喜欢使用null
检索从方法的值时,因为我可以用isset
确定的值是否返回,而不是使用empty
,不会在帐户采取:false
,0
,'0'
或一个空字符串,它可以在许多情况下可行的值。对我来说,这是一个凌乱的构造中最干净的解决方案。