PHP7中的缩小返回类型

时间:2017-11-10 14:33:33

标签: php type-hinting php-7.1

在PHP7.1类型提示中是否可以以某种方式缩小返回类型?

以下代码导致致命错误Declaration of A::foo(): Obj must be compatible with IA::foo(): IObj,即使通过缩小返回类型也不会破坏继承类型化原则:Obj实现IObj,因此当返回Obj实例时,将始终满足父类返回类型约束。

interface IObj {}
class Obj implements IObj {}
interface IA {
    function foo(): IObj;
}

class A implements IA {
    function foo(): Obj {
        return new Obj();
    }
}

我做错了什么,或者这是PHP的缺点?

1 个答案:

答案 0 :(得分:6)

就PHP而言,Obj implements IObj无法保证。因为您可以随时将Obj的声明移动到其他文件中,并且因为文件是在运行时加载而不是在某些编译步骤中加载的,所以Obj的实现将完全不知道在运行时加载,是否会implements IObj

所以,不,你不能改变实现中的返回类型,因为那时所有的类型安全都会消失。只有预先编译了预先确定Obj之前的代码,才能保证类型安全。