Логические операторы в условиях if и switch...case
Существуют две функции, выполняющие одну и ту же задачу - возвращают строку с названием сезона года, в зависимости от того какой месяц поступил на вход, но реализованные различными операторами условий. Одна c if - seasonIf(), другая switch...case - seasonCase().
В функции seasonCase() при значении $month = 0 срабатывает условие, хотя 0 в этом условии и не пахнет:
case (($month==12) || ($month==1) || ($month==2)):
и ветка выполнения не уходит на default:, а идет именно по этому пути. Хотя в отладчике PhpStorm это выражение = false
А в функции seasonIf() все работает как надо.
В чем причина?
Может быть в данном случае имеет место причина, связанная с неявным приведением типов?
Не могу понять какая?
Условия и логические операторы полностью идентичны.
Вот код обеих функций:
<?php
function seasonIf(int $month=0)
// Возвращает сезон года, в зависимости от месяца
{
if (($month==12) || ($month==1) || ($month==2)) {
return 'Зима';
} elseif (($month==3) || ($month==4) || ($month==5)) {
return 'Весна';
} elseif (($month==6) || ($month==7) || ($month==8)) {
return 'Лето';
} elseif (($month==9) || ($month==10) || ($month==11)) {
return 'Осень';
} else {
return 'Нет такого месяца в году!';
}
}
function seasonCase(int $month=0)
// Возвращает сезон года, в зависимости от месяца
{
switch ($month) {
case (($month==12) || ($month==1) || ($month==2)):
return 'Зима';
case (($month==3) || ($month==4) || ($month==5)):
return 'Весна';
case (($month==6) || ($month==7) || ($month==8)):
return 'Лето';
case (($month==9) || ($month==10) || ($month==11)):
return 'Осень';
default:
return 'Нет такого месяца в году!';
}
}
Ответы (2)
Ну так switch-case по-другому работает, вот если вы внутри вашего решения оставите всё как есть но замените
switch ($month) {
на
switch (true) {
то всё будет ок.
Либо оставить switch как есть и заменить кейсы
case 12:
case 1:
case 2:
return 'Зима';
Спасибо!
Помогло switch (true) {}, счас внимательно почитаю switch...case