This LSP violation causes a fatal error :
abstract class AbstractService { } abstract class AbstractFactory { abstract function make(AbstractService $s); } class ConcreteService extends AbstractService { } class ConcreteFactory extends AbstractFactory { function make(ConcreteService $s) {} }
This LSP violation also causes a fatal error :
interface AbstractService { } interface AbstractFactory { function make(AbstractService $s); } class ConcreteService implements AbstractService { } class ConcreteFactory implements AbstractFactory { function make(ConcreteService $s) {} }
While this LSP violation raises a warning :
class Service { } class Factory { function make(Service $s) {} } class MyService extends Service { } class MyFactory extends Factory { function make(MyService $s) {} }
Why? Aren't they all deadly because they are all contravariant?
php lsp liskov-substitution-principle
bishop
source share