题
告诉我,好的开发者可以发现/用之间的差异 Null
和 False
和 0
和所有其他的良好"没什么"实体。
什么样的 是 差异,特别是在PHP?它不会有事要做 ===
?
解决方案
它是特定于语言的,但在PHP中:
Null
表示“无”。 var尚未初始化。
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
(设置为off), DebugMode = True
(设置为on)和 DebugMode = Null 代码>(根本没有设置,会导致硬调试; - ))。
其他提示
null
是 null
。 false
是 false
。悲伤却又是真的。
PHP中的一致性不高。开发者 TRY 使null成为“未知”的意思。或“不存在的”。但通常False将作为“不存在”(例如strrpos('fail','search')将返回false,而不是null)
当他们已经使用false作为某些东西时,你经常会看到null被使用。例如filter_input()。如果变量未通过过滤器,则返回false。如果变量不存在则返回null(不存在意味着它也失败了过滤器?所以为什么甚至返回null?!?)
php具有在函数中返回数据的便利。并且开发人员填写所有类型的故障状态而不是数据。
在PHP中没有理智的方法来检测失败的数据(int,str等)(false,null)
你几乎要经常测试=== 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)
以下是一个例子:
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
是 true
,但 0 === false
是 false
。 !=
与!==
的情况相同。如果您使用提到的运算符将 null
与其他两个进行比较,则期望得到类似的结果。
现在在PHP中,当返回有时可以 0
(零)的值时,通常会使用这种值的值,但有时可能是函数失败了。在PHP的这种情况下,您返回 false
,您必须使用身份运算符 ===
检查这些情况。例如,如果您正在另一个字符串中搜索一个字符串的位置并且您正在使用 strpos()
,则此函数将返回数字位置,如果在此处找到该字符串,则该位置可以为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,试图从 strops返回
0
, null
, false
代码>!
在我发现逻辑没有向正确的方向流动之前,这是我试图做的所有事情,似乎在php编码中有一个黑洞:
概念 拿一个托管在服务器上的域名,并确保它不是root级别,确定几种不同的方法,但是由于我已经完成的其他php函数/构造,我选择了不同的。
无论如何这里是陈述的基础:
if (strpos(我每天浪费1/2,试图从 strops返回 0
, null
, false
代码>!
在我发现逻辑没有向正确的方向流动之前,这是我试图做的所有事情,似乎在php编码中有一个黑洞:
概念
拿一个托管在服务器上的域名,并确保它不是root级别,确定几种不同的方法,但是由于我已经完成的其他php函数/构造,我选择了不同的。
无论如何这里是陈述的基础:
{
if ((mydomain.co.uk, mydomain)) !== false )
{
echo "\n5 is True";
} else {
echo "\n5 is False";
}
}
阅读本主题后,最后,
我发现这很有用!!!
<*>
感谢这篇文章,我现在明白,即使它是圣诞节,也可能不是圣诞节,因为 false
,因为它也可以是 NULL
日!
在浪费了一天调试一些简单的代码之后,希望我之前已经知道了这一点,因为我本来能够找出问题,而不是到处试图让它工作。它不起作用,因为 False
, NULL
和 0
与 True或False或NULL
不完全相同>
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";
}
}
阅读本主题后,最后, 我发现这很有用!!!
<*>感谢这篇文章,我现在明白,即使它是圣诞节,也可能不是圣诞节,因为 false
,因为它也可以是 NULL
日!
在浪费了一天调试一些简单的代码之后,希望我之前已经知道了这一点,因为我本来能够找出问题,而不是到处试图让它工作。它不起作用,因为 False
, NULL
和 0
与 True或False或NULL
不完全相同>
从 PHP在线文件:
明确将一个价值为布尔,利用(bool)or(boolean)转换。
然而,在大多数情况下投unncecessary,由于一个值将自动转换,如果操作者、功能或控制结构需要一个布尔的论点。
在转换到布尔,以下价值观被认为是假:
- 布尔
FALSE
本身 - 整`0(zero)
- 漂浮
0.0
(zero) - 空串,并字符串
"0"
- 一系列零件
- 对象与零件变量(PHP4only)
- 特别类型
NULL
(包括取消变量) - 因创建的对象从空标签
每一个其他的价值被认为是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的内容不一定适用于Python,Perl或C等。虽然学习您正在使用的语言的规则很有价值,但依赖它们太多就是在寻找麻烦。当下一个程序员需要维护你的代码并且你已经使用了一些利用Null与False(例如)的一些细节的构造时,就会遇到麻烦。您的代码应该看起来正确(相反,错误的代码应该看起来错误)。
在数据库中使用Null来表示“无记录”。或“没有信息”。所以你可能有一个描述“这个用户是否希望由我们发送电子邮件”的字段,其中True表示他们这样做,False表示他们不想发送任何内容,但Null意味着你不要不知道。它们可以通过外连接等来实现。
Null的逻辑含义通常是不同的 - 在某些语言中,NULL不等于任何东西,因此如果(a == NULL)将始终为false。
所以我个人总是将一个布尔值初始化为FALSE,将一个布尔值初始化为NULL看起来有点icky(即使在C中,这两个都只是0 ......只是一个风格的东西)。
我认为糟糕的开发人员会在代码中找到null / 0 / false的所有不同用法。
例如,开发人员最常犯的错误之一就是以函数的形式返回错误代码。
// On error GetChar returns -1
int GetChar()
这是糖界面的一个例子。这在“Debuging the software development proccess”一书中有所解释。还有另一本书“编写正确的代码”。
这个问题是对char类型的暗示或假设。在某些编译器上,char类型可以是非签名的。因此,即使返回-1,编译器也可以返回1。 C ++或C中的这些编译器假设很难被发现。
相反,最好的方法是不要将错误代码与数据混合。所以以下功能。
char GetChar()
现在变成
// On success return 1
// on failure return 0
bool GetChar(int &char)
这意味着无论开发人员在开发商店中多么年轻,他或她都不会错。虽然这不是在谈论代码中的减少或依赖。
所以一般来说,交换bool作为语言中的第一类类型是可以的,我认为joel用他最近的帖子谈到了它。但是,尽量不要在日常工作中使用混合和匹配bool与你的数据,你应该完全没问题。
在PHP中,它取决于您是否在验证类型:
(
( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
( false !== null ) && ( false == null )
)
技术上null为 0x00
但在PHP (null == 0x00)&amp;&amp; (null!== 0x00)
。
0
是一个整数值。
关于PHP中的 NULL
的一个有趣的事实:如果你将var设置为等于 NULL
,它就像你调用 unset()<一样/ code>就可以了。
NULL
实质上意味着变量没有赋值给它; false
是一个有效的布尔值, 0
是一个有效的整数值,PHP在 0
,&quot;之间有一些相当难看的转换。 0“
,&quot;&quot;
, false
。
Null无效,False有点,0(可能)是32位。
不是PHP专家,但在某些更现代的语言中,这些语言不可互换。我有点想念0和false是可以互换的,但是布尔是一个实际类型,你可以拥有与之相关的方法和对象,这只是一个权衡。 Null是空的,基本上没有任何东西。
好吧,我在PHP时代记不起来回答“===”部分,但对于大多数C风格的语言,NULL应该在指针值的上下文中使用,false应该用作布尔值,零作为数值如int。 '\ 0'是字符上下文的惯用值。我通常也喜欢使用0.0代表浮点数和双打数。
所以..快速回答是:上下文。
在几乎所有现代语言中,null 逻辑指的是没有值的指针(或引用),或者未初始化的变量。 0是0的整数值,false是布尔值,嗯,false。为了使事情变得复杂,例如,在C中,null,0和false都以完全相同的方式表示。我不知道它在PHP中是如何工作的。
然后,为了使事情复杂化,数据库有一个null概念,这意味着缺少或不适用,并且大多数语言没有直接的方法将DBNull映射到它们的null。例如,直到最近,int为null且为零之间没有区别,但是可以使用可为空的int更改。
很抱歉让这听起来很复杂。这只是多年来一直是语言的一个难点,直到最近,它在任何地方都没有任何明确的解决方案。以前人们只是将事物混合在一起或者使空白或0表示数据库中的空值,这并不总是效果很好。
假和0在概念上相似,即它们是同构的。 0是自然数代数的初始值,False是布尔代数的初始值。
换句话说,0可以定义为当添加到某个自然数时产生相同数字的数字:
x + 0 = x
类似地,False是一个值,使得它与任何其他值的分离是相同的值:
x || False = x
Null在概念上是完全不同的东西。取决于语言,对于它有不同的语义,但它们都没有描述“初始值”。为假,0为。 Null没有代数。它与变量有关,通常表示变量在当前上下文中没有特定值。在大多数语言中,Null上没有定义任何操作,使用Null作为操作数是错误的。在某些语言中,有一个称为“底部”的特殊值。而不是“null”,它是不终止计算值的占位符。
有人可以向我解释为什么'NULL'不仅仅是比较实例中的字符串吗?
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
虚假问题来自PHP历史。该问题针对的是未明确定义的标量类型。
'*' == true -> true (string match)
'*' === true -> false (numberic match)
(int)'*' == true -> false
(string)'*' == true -> true
PHP7严格性是向前迈出的一步,但可能还不够。 https://web-techno.net/typing -with-PHP-7-什么,你不应该-DO /