First problem I see is this:
if(!is_int((int)$id))
return false;
You might as well say if(TRUE) since that conditional will always evaluate to TRUE; you're checking the value you just forced to be an integer by casting it is... an integer. What's more, you're checking the value after this forced type-casting, but you never actually store that value or use it anywhere; instead, you use the original value in $id that may not actually pass the is_int() check.
As for your if vs. switch arguement, you're right - multiple if() branches in a row will be evaluated individually. However, if only one of them should ever be executed at a time, then you shouldn't be using a bunch of if() statements but instead a single [man]if[/man]/[man]elseif[/man]/[man]else[/man] chain instead. That way, PHP will stop when it finds a match rather than evaluating the other conditionals.
In other words, it's really just a matter of style whether you use switch/case statements or just a series of if/elseif(s)/else statements instead.