No weźmy pierwszą zasadę : single responsibility principle. Klasa powinna mieć tylko jeden powód do zmiany.
Błędnie rozumiesz tą zasadę, ta zasada mówi, że każda klasa i funkcja powinna mieć pojedynczą odpowiedzialność. Więc opcja "C" będzie najbliższa tej zasadzie.
Co do walidacji, możesz poćwiczyć i skorzystać z kolejnej zasady SOLID, chodzi mi dokładnie Open/closed principle i stworzyć interfejs, który będzie implementowany do klas służących do walidacji.
Taki mały przykład na szybko z interfesju:
interface ValidatorInteraface
{
public function validate($value): ValidatedObjectInterface;
}
interface ValidatedObjectInterface
{
public function isValid(): bool;
public function message(): string;
}