Нормален ли такой подход в организации моделей данных?
По большому счету, у вас два вопроса:Можно ли хранить несколько классов в одном файле?Namespaces and classes MUST follow an "autoloading" PSR: [PSR-0, PSR-4].
This means each class is in a file by itself, and is in a namespace of at least one level: a top-level vendor name.PSR-1
Проблемы такой подход может вызвать только если вы начнете работать в команде, в которой принят какой-то другой стандарт. При наличии современных IDE нет никакой разницы в каком файле лежит класс и поэтому нет никаких причин не писать каждый класс в отдельный файл - так их будет проще читать и искать.Можно ли вызывать один класс через другой$userLinks = User::getUserLinksObj()->findLinks($userId);Если уж вы инкапсулируете, так инкапсулируйте так, чтобы было удобно пользоваться:$userLinks = User::findLinks($userId);
Но в таком случае почему бы не написать сразу нормально?$userLinks = UserLinks::findForUser($userId);
Зачем такая сильная связь между классами? У каждого класса - своя зона ответственности.
мне кажется здесь автору необходимо знать, верен ли подход получения данных через другой класс, 
а как хранить класс в этом файле или в другом дело вкуса.Aggregate Root .
Если UserLinks объект не может существовать без объекта User, то User выступает в роли родительского элемента в узле через которого происходит получение дочерних элементов.