Мне не нравится ни тот ни другой вариант.
Сами по себе функции фильтрации - довольно странная часть языка. И нынешний отказ от FILTER_SANITIZE_STRING как раз подтверждает этот тезис. Задумка была в теории неплохая, но реализация получилась так себе. А, главное - все эти функции только насильно меняют значение переменной. Молча.
А в нормальном современном приложении принято проверять переменную на соответствие правилам и
выдавать ошибку
В случае, если вместо числового id нам приходит вдруг массив, надо не молча его глотать и химичить с превращением в число, а сразу отвечать в репу 400-й ошибкой, не разводя сантименты.
Поэтому я бы взял какую-нибудь либу для валидации, вот первая же из гугля,
https://github.com/rakit/validation
И нормально проверял входящие параметры.
В случае, если это пользовательский ввод, типа логина и пароля, то отдавать культурные ошибки
Если же это чисто внутренняя инфраструктура приложения, типа id из нашей же ссылки, то при наличии ошибок молча отдавал 400.