缩小 return 输入 PHP7

Narrow return type in PHP7

是否可以在 PHP7.1 类型提示中缩小 return 类型?

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

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

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

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

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

所以,不,您不能在实现中更改 return 类型,因为从那时起所有类型安全性都会超出 window。类型安全只有在您预编译代码时才能得到保证,该代码预先确定了 Obj 的确切内容。