2

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

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

是否有第二个实例echo $var;不返回 0(假)而是不返回任何内容的原因?

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

4

8 回答 8

5

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

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

$var最后是假的,因为$var === 0评估为假,然后将该值分配给$var.

echo由于 boolean false 评估为空字符串,因此最终没有输出任何内容:请参阅http://www.php.net/manual/en/language.types.string.php

于 2013-04-09T10:57:51.287 回答
3

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

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

于 2013-04-09T10:59:27.697 回答
2

那是因为

$var = $var === 0;

可以读作:

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

在正确的优先级。现在当$varis时1($var === 0)返回false通过 输出时表示为空字符串echo

false您可以通过使用运算符将​​值显式转换为整数来查看“0” (int)

echo (int)$var;        // ouputs "0"

falsePHP 将值表示为空字符串,因为 PHP 变量通常没有类型。没有 boolean、int 或 string - 仅在值的内部表示中(在 Zend 引擎中称为 ZVAL)。

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

由于 PHP 旨在生成网站,因此空变量 (false == 0 == "")在输出Docs中用空字符串表示

于 2013-04-09T10:58:58.753 回答
2

为了弄清楚这一点,你需要知道两件事:

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

由于echo对字符串进行操作,$var将被转换为字符串。并且布尔值false在转换为字符串时会导致空字符串(NULL顺便说一句)。

于 2013-04-09T11:06:26.547 回答
1

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

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

于 2013-04-09T10:57:44.873 回答
1

代码的关键部分是这样的:

echo $var;

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

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

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

于 2013-04-09T11:05:30.747 回答
0

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

于 2013-04-09T10:59:14.050 回答
0

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

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

在你的第三行,$var === 0评估为FALSE,所以,就像你把

$var = FALSE;

您不能打印布尔字符。但是,如果你var_dump($var);,你会看到它是一个布尔值 FALSE。

于 2013-04-09T10:59:20.760 回答