我被告知,优秀的开发人员可以发现/利用Null
和False
以及0
之间的差异以及所有其他好的“无”实体。
的区别是什么,特别是在PHP中?它与===
有关吗?
答案 0 :(得分:203)
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
(设置为关闭),DebugMode = True
(设置为开启)和DebugMode = Null
之间做出改变(根本不设置,将导致硬调试; - ))。
答案 1 :(得分:41)
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)
答案 2 :(得分:14)
以下是一个例子:
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的更多参考信息。它应该让你清楚地理解。
答案 3 :(得分:5)
False,Null,Nothing,0,Undefined 等等。
这些中的每一个都具有与实际概念相关的特定含义。有时,多个含义会重载到单个关键字或值中。
在 C 和 C ++ 中,NULL
,False
和0
重载为相同的值。
在 C#中,它们是3个不同的概念。
null
或NULL
通常表示缺乏价值,但通常没有说明原因。
0
表示自然数为零,并且与 1,2,3,等具有类型等效性,并且在支持NULL
的单独概念的语言中,只应处理一个数字
错误表示不真实。它用于二进制值。这并不意味着未设置,也不意味着0
。它只是表示两个二进制值之一。
没有任何东西可以表明该值是专门设置为什么都没有指示与null相同的东西,但是有意图。
某些语言中未定义表示尚未设置该值,因为没有代码指定实际值。
答案 4 :(得分:5)
在PHP中,您可以使用===和!==运算符来检查值是否相等以及它们的类型是否匹配。例如:0 == false
为true
,但0 === false
为false
。 !=
与!==
的情况相同。同样,如果您使用上述运算符将null
与其他两个进行比较,则需要类似的结果。
现在在PHP中,当返回有时可能为0
(零)的值时,通常会使用这种值的值,但有时可能是函数失败了。在PHP的这种情况下,您返回false
,您必须使用标识运算符===
检查这些情况。例如,如果您在另一个字符串中搜索一个字符串的位置并且您正在使用strpos()
,则此函数将返回数字位置,如果在最开始找到该字符串,则该数字位置可以为0,但是如果根本找不到字符串,然后strpos()
将返回false
,您在处理结果时必须考虑到这一点。
如果您将在函数中使用相同的技术,任何熟悉标准PHP库的人都将了解正在发生的事情以及如何检查返回的值是否是想要的或者在处理时发生了一些错误。对于函数参数实际上也是如此,你可以根据它们是数组还是字符串或者不是它来处理它们,并且这种技术在整个PHP中也被大量使用,所以每个人都会很容易地得到它。所以我猜这就是力量。
答案 5 :(得分:4)
我只是每天浪费1/2,试图从strpos获得0,null,false返回!
在我发现逻辑没有向正确的方向流动之前,这是我试图做的所有事情,似乎在php编码中有一个黑洞:
概念 拿一个托管在服务器上的域名,并确保它不是root级别,确定几种不同的方法,但是由于我已经完成的其他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和0都不是全部相同的True或False或null?
答案 6 :(得分:1)
Null在数据库中用于表示“无记录”或“无信息”。因此,您可能会有一个描述“此用户是否希望由我们发送电子邮件”的字段,其中True表示他们这样做,False表示他们不希望发送任何内容,但Null意味着您不要我知道。它们可以通过外连接等来实现。
Null的逻辑含义通常不同 - 在某些语言中,NULL不等于任何东西,因此如果(a == NULL)将始终为false。
所以我个人总是将一个布尔值初始化为FALSE,将一个布尔值初始化为NULL看起来有点icky(即使在C中,这两个都只是0 ......只是一个风格的东西)。
答案 7 :(得分:1)
在PHP中,它取决于您是否在验证类型:
(
( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
( false !== null ) && ( false == null )
)
技术上空为0x00
,但在PHP ( null == 0x00 ) && ( null !== 0x00 )
。
0
是一个整数值。
答案 8 :(得分:1)
我认为糟糕的开发人员会在代码中找到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与你的数据,你应该完全没问题。
答案 9 :(得分:1)
“*要显式地将值转换为boolean,请使用(bool)或(boolean)强制转换。但是,在大多数情况下,强制转换是不必要的,因为如果运算符,函数或控件结构需要,则会自动转换值一个布尔参数。 转换为布尔值时,以下值被视为FALSE: *布尔值FALSE本身 *整数0(零) *浮点数0.0(零) *空字符串,字符串“0” *一个零元素的数组 *一个零成员变量的对象(仅限PHP 4) *特殊类型NULL(包括未设置的变量) *从空标签创建的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在线文档中的“Comparison Operators”页面。
希望这有帮助。
答案 10 :(得分:1)
这些值之间的差异总是归结为详细的语言特定规则。您学习PHP的内容不一定适用于Python,Perl或C等。虽然学习您正在使用的语言的规则很有价值,但依赖它们太多就是在寻找麻烦。当下一个程序员需要维护你的代码并且你已经使用了一些利用Null与False(例如)的一些细节的构造时,就会遇到麻烦。您的代码应该看起来正确(反之,wrong code should look wrong)。
答案 11 :(得分:0)
关于PHP中NULL的一个有趣的事实:如果将var设置为NULL,则与在其上调用unset()的情况相同。
NULL本质上意味着变量没有赋值给它; false是一个有效的布尔值,0是一个有效的整数值,PHP在0,“0”,“”和false之间有一些相当丑陋的转换。
答案 12 :(得分:0)
有人可以向我解释为什么'NULL'不仅仅是比较实例中的字符串?
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
答案 13 :(得分:0)
通常,编程语言往往具有真实和虚假的价值。什么是真理和什么是虚假的规则因语言而异。
http://www.isolani.co.uk/blog/javascript/TruthyFalsyAndTypeCasting
答案 14 :(得分:0)
假和0在概念上相似,即它们是同构的。 0是自然数代数的初始值,False是布尔代数的初始值。
换句话说,0可以定义为当添加到某个自然数时产生相同数字的数字:
x + 0 = x
类似地,False是一个值,使得它与任何其他值的分离是相同的值:
x || False = x
Null在概念上是完全不同的东西。根据语言的不同,它有不同的语义,但它们都没有将“初始值”描述为False和0。 Null没有代数。它与变量有关,通常表示变量在当前上下文中没有特定值。在大多数语言中,Null上没有定义任何操作,使用Null作为操作数是错误的。在某些语言中,有一个称为“bottom”而不是“null”的特殊值,它是一个占位符,表示不终止的计算值。
I've written more extensively about the implications of NULL elsewhere.
答案 15 :(得分:0)
在几乎所有现代语言中,null 逻辑指的是没有值的指针(或引用),或者未初始化的变量。 0是0的整数值,false是布尔值,嗯,false。为了使事情变得复杂,例如,在C中,null,0和false都以完全相同的方式表示。我不知道它在PHP中是如何工作的。
然后,为了使事情复杂化,数据库有一个null概念,这意味着缺少或不适用,并且大多数语言没有直接的方法将DBNull映射到它们的null。例如,直到最近,int为null且为零之间没有区别,但是可以使用可为空的int更改。
很抱歉让这听起来很复杂。这只是多年来一直是语言的一个难点,直到最近,它在任何地方都没有任何明确的解决方案。以前人们只是将事物混合在一起或者使空白或0表示数据库中的空值,这并不总是效果很好。
答案 16 :(得分:0)
好吧,我在PHP时代回答“===”部分时记不清楚,但对于大多数C风格的语言,NULL应该在指针值的上下文中使用,false作为布尔值使用,以及零作为数值,如int。 '\ 0'是字符上下文的惯用值。我通常也喜欢使用0.0代表浮点数和双打数。
所以..快速回答是:上下文。
答案 17 :(得分:0)
Null无效,False有点,0(可能)是32位。
不是PHP专家,但在某些更现代的语言中,这些语言不可互换。我有点想念0和false是可以互换的,但是布尔是一个实际类型,你可以拥有与之相关的方法和对象,这只是一个权衡。 Null是空的,基本上没有任何东西。
答案 18 :(得分:-1)
伪造的问题来自PHP历史。该问题针对的是标量类型定义不明确的问题。
function encode()
{
iconv -f shift_jis -t utf-8 "$1" > test
# iconv -f iso8859-15 -t utf8 "$1" > test;
cat test > "$1";
}
function walk()
{
for file in `ls $1`
do
local path=$1"/"$file
if [ -d $path ]
then
echo "DIR $path"
walk $path
else
echo "FILE $path"
encode $path
fi
done
}
if [ $# -ne 1 ]
then
echo "USAGE: $0 TOP_DIR"
else
walk $1
fi
PHP7的严格性是向前迈出的一步,但可能还不够。 https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/