0 == *计算结果为真,0 === *计算为假

时间:2014-02-20 22:28:15

标签: php mysql sql cron character

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

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

详情

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

  

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

破碎的选择

以下将生成一个选择星期日作为选定选项。 Inspector显示选择值=“*”和选项值=“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>

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

1 个答案:

答案 0 :(得分:2)

字符串'*'的计算结果为true,因为这是字符串应根据转换为boolean的合同进行评估的方式:http://www.php.net/manual/en/language.types.boolean.php

所以不应该有任何疑惑。

a === b不执行任何类型强制,这意味着ab必须相同:

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

现在,integer不是string,因此0 === '*'评估为false