鉴于$ var = 1,为什么$ var = $ var === 0不会返回false?

时间:2013-04-09 10:54:43

标签: php

首先,我在这里处理1和0,我很清楚1 == true和0 == false。但是我很好奇为什么这不起作用:

$var = 1;
echo $var; /* 1 */
$var = $var === 0;
echo $var; /* Nothing */

是否有理由echo $var;的第二个实例未返回0(false)而不返回任何内容?

同样,!$var也不会返回任何内容。是什么导致了这种行为?

8 个答案:

答案 0 :(得分:5)

使用var_dump()代替echo更容易显示正在发生的事情,因为显示了类型:

$var = 1;
var_dump($var); /* int(1) */
$var = $var === 0;
var_dump($var); /* bool(false) */
最后的

$var为false,因为$var === 0的计算结果为false,然后该值已分配给$var

最终echo没有输出任何内容,因为布尔值false计算为空字符串:请参阅http://www.php.net/manual/en/language.types.string.php

答案 1 :(得分:3)

0等于false,但是0 不是false。变量设置为false,并且false回显到字符串中为""(空字符串)。

请参阅http://www.php.net/manual/en/language.types.string.php#language.types.string.casting

答案 2 :(得分:2)

那是因为

$var = $var === 0;

可以理解为:

$var = ($var === 0);   // sets $var to the result of the comparison

正确的优先顺序。现在,当$var1时,($var === 0)会返回false,当通过echo输出时,false表示为空字符串。

您可以使用(int)运算符显式地将echo (int)$var; // ouputs "0" 值转换为整数来查看“0”:

false
PHP将{p> {{1}}值表示为空字符串,因为PHP变量通常没有类型。没有boolean,int或string - 仅在值的内部表示中(在Zend Engine中称为ZVAL)。

在PHP代码中,ZVAL会自动转换为最匹配的类型,具体取决于您使用它的位置。这称为type jugglingDocs

由于PHP旨在生成网站,空变量(false == 0 ==“”)are represented with an empty string in the outputDocs

答案 3 :(得分:2)

你需要知道两件事才能解决这个问题:

您可以注意到=的优先级低于===,因此表达式$var = $var === 0;变为$var = ($var === 0); - 在这种情况下$var包含(bool)false 1}}

由于echo对字符串进行操作,$var将转换为字符串。当转换为字符串时,布尔值false会导致空字符串(顺便说一下,NULL也是如此)。

答案 4 :(得分:1)

如果添加var_dump($ var);在那个小块的末尾你会看到$ var = false。

那是因为$ var === 0;是假的;

答案 5 :(得分:1)

代码的关键部分是:

echo $var;

echo构造接收并生成字符串。如果您的变量是布尔值,则适用conversion适用:

  

布尔值TRUE值转换为字符串“1”。 布尔值为FALSE   转换为“”(空字符串)。这允许转换回来   在布尔值和字符串值之间。

这就是echo不是一个好的调试工具的原因,因为将所有内容扁平化为字符串会导致丢失有价值的信息,除非您使用的工具知道如何提取该信息({{1}没有)。为此,var_dump()通常是更好的选择。

答案 6 :(得分:0)

$var = $var === 0;$var === 0false)的结果分配给$var。并且echo false不会产生任何输出。

答案 7 :(得分:0)

使用===时,它也与数据类型匹配。 所以在这种情况下,1 === TRUE不是TRUE。

$var = 1;
echo $var; /* 1 */
$var = $var === 0;
echo $var; /* Nothing */

在第三行中,$var === 0评估为FALSE,因此,就像你放

一样
$var = FALSE;

您无法打印布尔字符。 但是,如果你var_dump($var);,你会发现它是一个布尔值为FALSE。