Кто сталкивался со странным багом в PHP при использовании switch case?
Потому что вы перепутали место условия и место значения условия.
Почему с 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. Это баг, который написали вы, невнимательно читая документацию.
То что в некоторых случаях работало - это всего лишь стандартные для этого языка манипуляции с типами.
php.net/manual/ru/control-structures.switch.phpЗаметьте, что конструкция switch/case использует нестрогое сравнение (==). 
switch это if с оператором сравнения, туда нельзя запихивать условие.