PHP 7.4 是当前 PHP7 系列中最新的版本,发布于2019年11月28日。在 PHP 7.4 的新特性中有这么一条内容:
Limited return type covariance and argument type contravariance
中文的字面意思就是:限制返回类型协变和参数类型逆变。关于这个特性的RFC在这里可以查看。这个具体是什么意思呢?首先我们要知道什么是协变和逆变,维基百科中是这么定义的:
协变与逆变(Covariance and contravariance )是在计算机科学中,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父/子型别关系的用语。
光看这个定义,我是难以理解它在说什么的。我们看看代码例子说明:
<?php class A {} class B extends A {} class Producer { public function method(): A {} public function contraVariantArguments(B $type) {} } class ChildProducer extends Producer { public function method(): B {} public function contraVariantArguments(A $type) {} } ?>
我们定义了两个类:A和B。B继承自A,A是父类,B是子类。
在 Producer 类中,method 方法的返回值类型是 A。ChildProducer 继承自 Producer,其 method 方法的返回值类型是 B。因为 B 是 A 的子类,我们称之为这种类型的改变为协变。类型约束相对来说变窄了。这种是符合里氏替换原则的,凡是父类出现的地方,都可以用子类进行替换。
在 Producer 类中,contraVariantArguments 方法的 $type 参数类型是 B。ChildProducer 继承自 Producer,其 contraVariantArguments 方法的返回值类型是 A。因为 B 是 A 的子类,我们称之为这种类型的改变为逆变。类型约束相对来说变宽了。
这里有一篇文章详细介绍了里氏替换和类型安全,可以仔细阅读看看。