今天早上编辑突然无法运行的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>
如果你已经持续到这篇文章的结尾,请告诉我我错过了什么?
答案 0 :(得分:2)
字符串'*'
的计算结果为true,因为这是字符串应根据转换为boolean
的合同进行评估的方式:http://www.php.net/manual/en/language.types.boolean.php
所以不应该有任何疑惑。
a === b
不执行任何类型强制,这意味着a
和b
必须相同:
现在,integer
不是string
,因此0 === '*'
评估为false
。