2014-02-20 151 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