С точки зрения кодинга понятно почему так сделано, видимо так было проще. Вместо того чтобы в функцию засовывать проверку типа, оставили это на долю кодера. И назвали это фичей. Но очевидно, что по-хорошему, если бы я хотел проверять наличие символа по коду, я бы сделал это явно, а-ля strpos($string, chr($symbol)).
В общем, ещё одна причина почему стоит всегда использовать mb_* (даже когда уверен что на входе исключительно однобайтовые строки, которые, путешествуя по хранилищам данных, могут из '626' превратиться в 626) и не думать об этом больше.
PS В Си это вполне ожидаемо, а вот в языке который позиционирует себя как "язык для домохозяек" это просто свинство. Именно потому у php такая слава.