【问题标题】:0 == * evaluates true, 0 === * evaluates false0 == * 评估为真,0 === * 评估为假
【发布时间】:2014-02-20 22:28:14
【问题描述】:

今天早上在编辑突然无法运行的 CRON 编辑器时,我发现了一个我无法真正解释的奇怪现象。希望这里有人可以启发我。

假设有人可以在没有任何上下文的情况下回答这个问题,我的问题本质上是“为什么 0 == * 评估为真?”

详情

我们将所有活动 CRON 作业的详细信息存储在 MySQL 表中。分钟、小时、天和月字段的类型为varchar,默认为“*”。在编辑 CRON 作业时,我们有一个应该从获取的行中选择当前值的选择,下面标记为 $CRON,下面是一个示例。

数组 ( [CRONID] => 10 [分钟] => 21 [小时] => 6 [天] => * [月] => * [工作日] => * [文件] => CRON_Prop_44.php [ Status] => 1 [CreateBy] => 128 [CreateDate] => 2014-02-20 [ChangeBy] => 128 [ChangeDate] => 2014-02-20)

破碎的选择

以下将生成一个选择,其中星期日作为选定选项。 Inspector 显示 option value="*" 和 option value="0" 都被选中。

    <select name="Weekday">
    <option value="*" <?php if ($CRON['Weekday'] == "*" ) { echo "selected";} ?> >* - Every day</option>
<?php
$x = 0;
while ($x < 7) {
    switch ($x) {
        case 0:
        $dayname = "Sunday";
        break;
        case 1:
        $dayname = "Monday";
        break;
        case 2:
        $dayname = "Tuesday";
        break;
        case 3:
        $dayname = "Wednesday";
        break;
        case 4:
        $dayname = "Thursday";
        break;
        case 5:
        $dayname = "Friday";
        break;
        case 6:
        $dayname = "Saturday";
        break;
    }
?>
    <option value="<?php echo $x; ?><?php if ($CRON['Weekday'] == $x ) { echo "selected";} ?> ><?php echo $dayname; ?></option>
<?php
    $x++;
}?>

周日也被选中的事实让我相信0 == * 是真的。通过添加=== 比较运算符而不是==,我可以按预期工作,但我不明白为什么。是开关的问题吗?选项值=“0”?或者,正如标题所暗示的那样,0 == * 是真的?

(某种)功能选择

我觉得上面前人的代码有点乱,所以我目前正在做以下。尽管如此,将=== 更改为== 只会选择星期日。

<select name="Weekday">
    <option value="*" <?php if ($CRON['Weekday'] == "*" ) { echo "selected";} ?> >* - Every day</option>
<?php
    $days = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
    $x = 0;
    while ($x < 7) {
        echo '<option value="' .  $x . '" ' . (($CRON['Weekday'] == $x) ? 'selected' : "") . '>' . $days[$x] . '</option>';
        $x++;       
    }
?>
</select>

如果你坚持到这篇文章的结尾,请告诉我我错过了什么?

【问题讨论】:

    标签: php mysql sql cron character


    【解决方案1】:

    字符串'*' 评估为真,因为这就是字符串应该如何根据转换为boolean 的合同进行评估:http://www.php.net/manual/en/language.types.boolean.php

    所以不用怀疑。

    a === b 不做任何类型强制,这意味着要相同,a 和 b 必须是:

    • 同类型(整数/数字或字符串)
    • 承担相同的价值

    现在,integer 不是string,所以0 === '*' 的计算结果为false。

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 2021-11-01
      • 2018-07-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      相关资源
      最近更新 更多