Нормально ли проверять одни и те же данные по десять раз?
Проверять данные в каждом методе - это вполне отличная практика, по сути это соблюдение интерфейса метода.
Но возвращать при этом null/false - практика хреновая, если ваш метод на вход требует int, а получил array - надо бросать исключение. Так вы будете знать, что внешний код, который использует ваш метод работает не корректно.
Для объектов настоятельно рекомендую использовать type hinting:public function test(MyObject $object, $id)
{
    if (!is_int($id)) {
        throw new \InvalidArgumentException('Argument "id" must be int');
    } elseif ($id < 0) {
        throw new \InvalidArgumentException('Argument "id" must be positive');
    }
...
Если пишете на семерке, то и для скаляров и на вывод - тоже стоит указывать type hinting. Правда с выводом не всегда это можно делать, например возврата null, или что-то еще.public function checkPositive(int $intData): bool
Для сокращения проверок можете мой пакет заюзать https://packagist.org/packages/ko-ko-ko/assert, он спроектирован под максимальную производительность и использование в каждом методе.Стоит ли продолжать заморачиваться с проверкой передаваемых данных в каждой функции?
Да. За счет этого вы выигрываете в безопасности, надежности и времени поиска багов.
проверять много раз - избыточный код. чем проще код, тем дешевле его написание и поддержка.
я использую такой подход:
проверяю данные как можно позже, сразу перед использованием этих данных для работы с базой данных, либо там, где это нужно для логики моего кода.
то есть, ко всем данным полученным от пользователя я отношусь как к непроверенным и мне не нужно запоминать, проверял ли я их где-то до этого или нет.