I've have an animal class class Animal { public function eat(Food $food); } the subclass who inherit it actually cannot support all kinds of Food (Cat can only eat meat): class Cat extends Animal { public function eat(Food $food) { if (!$food instanceof Meat) throw new InvalidArgumentException(); } } of course, `Meat` is a subclass of `Food` So is this code violate LSP (I think it does)? and how to re-design it?