В PHP 7.2.0 была добавлена частичная контрвариантность путем устранения ограничений типа для параметров в дочернем методе.
Начиная с PHP 7.4.0, добавлена полная поддержка ковариации и контравариантности.
В PHP 7.4+ есть ковариантность возвращаемых типов
То есть, ковариантность это сужение диапазона вариантов
В PHP 7.2.* || 7.3.* ковариантность можно достигнуть только если возвращаемый тип вовсе не был указан
<?php
interface Message
{
}
class Sms implements Message
{
}
class Email implements Message
{
}
interface MessageMaker
{
public function make(): Message;
}
class SmsMaker implements MessageMaker
{
public function make(): Sms // Возвращаем класс Sms вместо Message
{
return new Sms();
}
}
class EmailMaker implements MessageMaker
{
public function make(): Email // Возвращаем класс Email вместо Message
{
return new Email();
}
}
В PHP есть контрвариантность параметров функции
Контрвариантность - расширение диапазона вариантов
В PHP 7.2.* || 7.3.* контрвариантность можно достигнуть только при помощи полного устранения типа у параметра
<?php
interface MediaContent
{
}
class Article implements MediaContent
{
}
interface Media
{
public function publish(Article $media): void;
}
class Newspaper implements Media
{
public function publish(Article $media): void
{
}
}
class Website implements Media
{
public function publish(MediaContent $media): void // расширился принимаемый тип (7.4+)
{
}
public function publish($media): void // расширился принимаемый тип (7.2.* || 7.3.*)
{
}
}