【发布时间】:2019-09-25 22:37:15
【问题描述】:
这个依赖倒置的代码应该可以正常工作,但它会报错。
我在这里做错了什么?
interface A { }
abstract class B implements A { }
class C extends B { }
abstract class D {
public function foo(A $a) { }
}
class E extends D {
public function foo(C $c) { }
}
错误是:
警告:E::foo(C $c) 的声明应该与[...][...]中的D::foo(A $a) 兼容 第 24 行
令人惊讶的是,对构造函数方法执行相同的操作就可以了:
interface A { }
abstract class B implements A { }
class C extends B { }
abstract class D {
public function __construct(A $a) { }
public function foo(A $a) { }
}
class E extends D {
public function __construct(C $c) { }
public function foo(A $c) { }
}
【问题讨论】:
-
我在这里测试了 7.3.5 sandbox.onlinephpfunctions.com/code/…
-
不完全。在这种情况下,参数是逆变的。抽象类 D 接受所有高于 A 的子类型。B 是 A 的子类型,C 是 B 的子类型,B 是 A 的子类型,因此在这种情况下,A 是最后一个特定类型,因此它必须接受高于它的所有内容。
-
那么为什么在构造函数中一切正常? sandbox.onlinephpfunctions.com/code/…