In PHP 7.2.0, partial contravariance was introduced by removing type resetrictions on parameters in a child method. As of PHP 7.4.0, full covariance and contravariance support was added.
Covariance allows a child's method to return a more specific type than the return type of its parent's method. Whereas, contravariance allows a parameter type to be less specific ina child method, than that of its parent.
To illustrate how covariance works, a simple abstract parent class, Animal
is created. Animal
will be extended by children classes, Cat
, and Dog
.
(example)
Note that there aren't any methods which return values in this example. A few factories will be added which return a new object of class type Animal
, Cat
, or Dog
.
(example)
Continuing with the previous example with classes Animal
, Cat
, and Dog
, a class called Food
and AnimalFood
will be included, and a method eat
is added to the Animal
abstract class.
(example)
(change nom noms
to eats
)
In order to see the behavior of contravariance, the eat
method is overriden in the Dog
class to allow any Food
type object. The Cat
class remains unchanged.
(example)
The next example will show the behavior of contravariance.