为什么在布尔类型上转换 bool 返回总是 false

Gom*_*oms 2 php casting

我只想知道为什么如果我使用 (bool) \xe2\x80\x94 表达式 \xe2\x80\x94 例如2 < 1\xe2\x80\x94 的布尔值进行类型转换 \xe2\x80\x94 总是返回false,即使表达式返回true

\n\n

举个例子会说的更清楚

\n\n
<?php\n$value = (bool) 2 > 1;\nvar_dump($value); // bool(false)\n\n$value = (bool) 2 < 1;\nvar_dump($value); // bool(false)\n\nvar_dump((bool)true) // bool(true)\n\nvar_dump((bool)false) // bool(false)\n
Run Code Online (Sandbox Code Playgroud)\n

Jon*_*art 5

问题

强制转换的优先级高于比较运算符。所以在这个表达式中:

$value = (bool) 2 > 1;
Run Code Online (Sandbox Code Playgroud)

在应用运算符之前强制转换(bool)与文字相关联。因此,该表达式等价于:2 >

$value = ((bool) 2) > 1;
Run Code Online (Sandbox Code Playgroud)

这相当于:

$value = true > 1;
Run Code Online (Sandbox Code Playgroud)

这在语义上没有意义,但 PHP 允许并转换为整数,以便应用>运算符,有效地给出:

$value = 1 > 1;
Run Code Online (Sandbox Code Playgroud)

返回false.


解决方案

解决方案是添加括号并转换整个表达式:

$value = (bool)(2 > 1);
Run Code Online (Sandbox Code Playgroud)

即使没有必要,括号也会很有帮助,因为它们可以让更随意的读者清楚地了解您的意图,即使是那些可能没有记住运算符优先级表的读者。