Я думаю разбираться с типизацией должна функция куда передается переменная.
Приведение типов должно быть уместным, например, если ожидается что придет boolean, то тупизм делать так (boolean)$str ибо если придет строка '0', 'false', 'null' и пр. то выйдет трудно отслеживаемая ошибка.
Поэтому тут радикально is_bool() и выводим ошибку. Ну можно 0 и 1 обработать, чтобы не матерились.
Если ожидается строка, то здесь типизируем, валидируем.
Если ожидается массив или объект, то тут понятно func(Array $vars) func(MyObject $obj)
C int'том is_numeric, есть ли точка, затем типизация
С float заменяем запятую, is_numeric, затем типизация