我只想知道为什么如果我使用 (bool) \xe2\x80\x94 表达式 \xe2\x80\x94 例如2 < 1
\xe2\x80\x94 的布尔值进行类型转换 \xe2\x80\x94 总是返回false
,即使表达式返回true
?
举个例子会说的更清楚
\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
强制转换的优先级高于比较运算符。所以在这个表达式中:
$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)
即使没有必要,括号也会很有帮助,因为它们可以让更随意的读者清楚地了解您的意图,即使是那些可能没有记住运算符优先级表的读者。