@seredaes

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

<?php

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


Выводит - 1.
Т.е. баг только с 0, с другими цифрами бага нет. Я что-то такое нашел в доке, но не понял.
Проясните пожалуйста :) Спасибо заранее!
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
@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 с оператором сравнения, туда нельзя запихивать условие.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
от 2 000 до 4 000 usd.
Teamlead Краснодар
До 100 000 руб.
HTML Academy Санкт-Петербург
от 130 000 до 140 000 руб.
17 авг. 2018, в 17:10
15000 руб./за проект
17 авг. 2018, в 16:58
60000 руб./за проект
17 авг. 2018, в 16:55
10000 руб./за проект