首先,我在这里处理1和0,我很清楚1 == true和0 == false。但是我很好奇为什么这不起作用:
$var = 1;
echo $var; /* 1 */
$var = $var === 0;
echo $var; /* Nothing */
是否有理由echo $var;
的第二个实例未返回0(false)而不返回任何内容?
同样,!$var
也不会返回任何内容。是什么导致了这种行为?
答案 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
正确的优先顺序。现在,当$var
为1
时,($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 === 0
(false
)的结果分配给$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。