缩小 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
的确切内容。
是否可以在 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
的确切内容。