【问题标题】:Why casting bool on boolean type return always false为什么在布尔类型上转换 bool 总是返回 false
【发布时间】:2018-08-20 11:48:56
【问题描述】:

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

一个例子会说得更清楚

<?php
$value = (bool) 2 > 1;
var_dump($value); // bool(false)

$value = (bool) 2 < 1;
var_dump($value); // bool(false)

var_dump((bool)true) // bool(true)

var_dump((bool)false) // bool(false)

【问题讨论】:

  • 强制转换的优先级高于比较运算符。
  • 您能详细介绍一下吗?
  • (bool) 2 &gt; 1((bool) 2) &gt; 1true &gt; 1false。使用(bool)(2 &gt; 1)

标签: php casting


【解决方案1】:

问题

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

$value = (bool) 2 > 1;

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

$value = ((bool) 2) > 1;

相当于:

$value = true > 1;

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

$value = 1 > 1;

返回false


解决方案

解决方法是加括号,然后强制转换整个表达式:

$value = (bool)(2 > 1);

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

【讨论】:

  • “坦率地说,这毫无意义” - 就像在 C 中一样,true1false0true &gt; 1 因此是 1 &gt; 1,因此是 false。 (不反对没有意义,只是解释为什么结果是这样的。)
  • @Amadan 谢谢。是的,我的意思是它没有语义意义。有趣的是,像 Rust 这样的语言正在从这些错误中学习并禁止自动布尔类型转换。
【解决方案2】:

您将2 转换为布尔值,因为转换的优先级高于比较返回true。那么你的表达是:

true > 1

这是false
将您的表达式放在括号之间或转换表达式的结果:

$value = (bool) (2 > 1); // true

// Or
$value = 2 > 1;
var_dump((bool)$value); // true

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 2017-11-23
    • 2018-03-24
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多