2014-02-20 6 views
0

Сегодня утром, редактируя наш редактор CRON, который неожиданно не удалось запустить, я нашел странность, которую я не могу объяснить. Надеюсь, кто-то здесь может просветить меня.0 == * оценивает true, 0 === * оценивает false

Предположим, что кто-то может ответить на этот вопрос без какого-либо контекста, мой вопрос по существу «Почему 0 == * оценивается как истина?»

Подробности

Мы храним информацию обо всех активных заданий CRON в таблице MySQL. Тип полей Minutes, Hours, Days и Months - varchar со значением по умолчанию '*'. При редактировании задания CRON у нас есть выбор, который должен был выбрать текущее значение из выбранной строки, помеченную ниже как $CRON и пример которой следует.

Array ([CRONID] => 10 [минут] => 21 [часов] => 6 [дней] => * [месяцев] => * [Будний] => * [Файл] => CRON_Prop_44 .php [Статус] => 1 [CreateBy] => 128 [CreateDate] => 2014-02-20 [ChangeBy] => 128 [ChangeDate] => 2014-02-20)

Сломанная Выберите

Следующее будет производить выбор с воскресеньем в качестве выбранного варианта. Инспектор показывает, что выбрано значение параметра = "*" и значение опции = "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 == *?

The (Сорт) Функционирование Выбери

Я думал, что код предыдущего человека выше был немного грязным, так что я сейчас делаю следующее. Тем не менее, изменение === на == приводит к тому, что будет выбрано только воскресенье.

<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

Строка '*' имеет значение верно, потому что, как строки следует оценивать в соответствии с договором литья до boolean: http://www.php.net/manual/en/language.types.boolean.php

Так что не должно быть интересно.

a === b не делает никаких преобразований, а это означает, что то же самое, a и b должны быть:

  • одного и того же типа (целое число/число или строка)
  • несут такое же значение

Теперь integer не string, поэтому 0 === '*' вычисляет false.

+0

Ahhhh Я вижу, спасибо. – jboneca

Смежные вопросы