So with the introduction of single-character ranges to the range() function, the internal function tries to be "smart", and (I am inferring from behavior here) apparently checks the type of the incoming values. If one is numeric, including numeric string, then the other is treated as numeric; if it is a non-numeric string, it is treated as zero.
But.
If you pass in a numeric string in such a way that is is forced to be recognized as type string and not type numeric, range() will function quite differently.
Compare:
<?php
echo implode("",range(9,"Q"));
echo implode("",range("9 ","Q")); echo implode("",range("q","9 "));
?>=<;:987654
?>
I wouldn't call this a bug, because IMO it is even more useful than the stock usage of the function.