Потому что вы перепутали место условия и место значения условия.
Почему с 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. Это баг, который написали вы, невнимательно читая документацию.
То что в некоторых случаях работало - это всего лишь стандартные для этого языка манипуляции с типами.