Вчера наткнулся в комментариях php.net на забавную недокументированную особенность switch в php: возможность писать после case не только конкретные значения переменной, но и вполне самостоятельные условия, в т.ч. никак не связанных с самой переменной. Например:

$age = 8;
$disableAgeCheck = false;

switch($age)
{
case ($disableAgeCheck): echo “Проверка возраста отключена”;break;
case ($age<0): echo “Ещё не родился?”;break;
case 5: echo “Ровно 5 лет”;break;
case ($age<10): echo ‘Ребёнок';break;
case ($age<20): echo ‘Подросток';break;
default: echo ‘Взрослый';
}

Удивительно, но все ветки, включая первую – работают правильно.
Подытожив, case работает стандартно, если в нём константа, если переменная или выражение – вычисляет и проверяет логическое значение.