在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的缺点?
答案 0 :(得分:6)
就PHP而言,Obj implements IObj
无法保证。因为您可以随时将Obj
的声明移动到其他文件中,并且因为文件是在运行时加载而不是在某些编译步骤中加载的,所以Obj
的实现将完全不知道在运行时加载,是否会implements IObj
。
所以,不,你不能改变实现中的返回类型,因为那时所有的类型安全都会消失。只有预先编译了预先确定Obj
之前的代码,才能保证类型安全。