2014-02-20 153 views
0

今天早上,在编辑我们的CRON编辑器时,突然无法运行,我发现了一个奇怪的现象,我无法真正解释。希望这里有人能够启发我。0 == *评估结果为true,0 === *评估结果为false

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

详细

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

阵列([CRONID] => 10 [分钟] => 21 [小时] => 6 [天] => * [个月] => * [平日] => * [文件] => CRON_Prop_44 .PHP [状态] => 1 [CreateBy] => 128 [CREATEDATE] => 2014年2月20日[ChangeBy] => 128 [CHANGEDATE] => 2014年2月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> 

如果你已经穿了这个帖子的末尾,请告诉我,我缺少的是什么?

回答

2

字符串'*'计算结果为true,因为这是字符串应该如何根据铸造boolean合同评价:http://www.php.net/manual/en/language.types.boolean.php

所以应该没有怀疑。

a === b没有做任何类型强制转换,这意味着向是相同的,ab必须是:

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

现在,一个integer不是string,所以0 === '*'评估为false

+0

Ahhhh我明白了,谢谢。 – jboneca