Самый непонятный принцип на первый взгляд. О чем он говорит?
- Предварительные условия не могут быть усилены в подтипе.
- Постусловия не могут быть ослаблены в подтипе.
- Инварианты супертипа могут быть сохранены в подтипе.
С ума можно сойти, о чем тут речь?
Самый простой пример, который объяснит саму суть этого принципа, и вот пример, который нарушает этот принцип:
Супертип с его предварительными условиями
class A { public function getData(){ return ['one'=>'two']; } }
Подтип с ослабленными постусловиями
class B extends A { public function getData(){ return true; } }
Все, принцип нарушен, используя наследника B.
Обратившись к методу getData() мы получим не массив, а булево значение.
Всего навсего, нужно соблюдать возвращаемый тип значений из функций, методов и т.п мест которые мы переопределяем.