聊一聊 PHP 7.4 中的返回类型协变和参数类型逆变

Eddy 2019-12-07 15:24:03

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 的子类,我们称之为这种类型的改变为逆变。类型约束相对来说变宽了。

这里有一篇文章详细介绍了里氏替换和类型安全,可以仔细阅读看看。

本文来源于 Eddy

免责声明:
1. 本文版权归属原作所有,仅代表作者本人观点,不代表币推儿的观点或立场。
2. 如发现文章、图片等侵权行为,侵权责任将由作者本人承担。