@seredaes

Кто сталкивался со странным багом в PHP при использовании switch case?

<?php

$userLang = 0;
switch($userLang) {
    case ($userLang>2):
            $userLang = 1;
            break;
}
echo $userLang;


Выводит - 1.
Т.е. баг только с 0, с другими цифрами бага нет. Я что-то такое нашел в доке, но не понял.
Проясните пожалуйста :) Спасибо заранее!
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
ivankomolin
@ivankomolin
Потому что вы перепутали место условия и место значения условия.

Почему с 0 обрабаывает так:
//В switch пишется условие, результат выполнения которого ищется в case
switch(0) {
    case (0>2)://false, итог: 0==false, ответа да, case сработает
            $userLang = 1;
            break;
}


Почему с 1 вы не заметите:
//В switch пишется условие, результат выполнения которого ищется в case
switch(1) {
    case (1>2)://false, итог: 1==false, ответа нет, case не сработает
            $userLang = 1;
            break;
}


Почему со значениями больше 2х все хорошо:
//В switch пишется условие, результат выполнения которого ищется в case
switch(3) {
    case (3>2)://true, итог: 3==true, ответа да, case сработает
            $userLang = 1;
            break;
}


Поэтому никакой это не баг php. Это баг, который написали вы, невнимательно читая документацию.
То что в некоторых случаях работало - это всего лишь стандартные для этого языка манипуляции с типами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
то что вы написали равно
<?php

$userLang = 0;
switch(false) {
    case false:
            $userLang = 1;
            break;
}
echo $userLang;


userLang будет равен 1. никакого бага
Ответ написан
Комментировать
@neol
Странное у вас значение в case. Мне кажется вы вообще не очень понимаете как работает switch.

Для сравнения с $userLang выражение ($userLang>2) неявно приводится к типу int и там получается 0.
Это не баг в PHP.
Ответ написан
@Azperin
Дилетант
php.net/manual/ru/control-structures.switch.php

Заметьте, что конструкция switch/case использует нестрогое сравнение (==).

switch это if с оператором сравнения, туда нельзя запихивать условие.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы