Логические операторы в условиях 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 'Нет такого месяца в году!';
    }
}
jetsaus 03.08.2020 в 16:12

Ответы (2)


Ну так switch-case по-другому работает, вот если вы внутри вашего решения оставите всё как есть но замените

    switch ($month) {

на

    switch (true) {

то всё будет ок.

Либо оставить switch как есть и заменить кейсы

    case 12:
    case 1:
    case 2:
            return 'Зима';
ivashkevich 05.08.2020 в 08:19

Спасибо!
Помогло switch (true) {}, счас внимательно почитаю switch...case

jetsaus 05.08.2020 в 16:35

var_dump(0 == false) switch не строгое сравнение

[email protected] 05.08.2020 в 09:25

Добавить новый ответ