我不知道为什么此代码在PHP中不起作用?
<?php interface Engine { function run(); } interface HydroEngine extends Engine { function run(); } interface Car { function setEngine(Engine $engine); } interface WaterCar extends Car { function setEngine(HydroEngine $engine); } ?>
看来它没有违反任何OOP规则,但是为什么它给我一个错误?
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
它 确实 违反了SOLID规则。您声明Car::setEngine接受一个类型的参数Engine,但子级WaterCar::setEngine接受一个类型的参数HydroEngine。即使HydroEngine是的子类型Engine,它仍然是不同的类型。
Car::setEngine
Engine
WaterCar::setEngine
HydroEngine
当上课的时候Foo implements WaterCar,上课也是正确的instanceof Car。但是Foo::setEngine接受一个HydroEngine,但是不接受一个Engine。因此,Foo::setEngine据推测implements Car,但不接受type参数Engine。这打破了Liskov替代原则。您不能在子接口,周期中更改参数的类型。
Foo implements WaterCar
instanceof Car
Foo::setEngine
implements Car
继承的关键字是明确的 extends 。子类与父类 完全相同 ,甚至可能 更多 。它不能做的比父项 少 。既然HydroEngine是一个专门亚型Engine,这将意味着一个WaterCar不 小于 比Car,因为它只接受的更窄的亚型Engine。例如:
extends
WaterCar
Car
function (Car $car) { $engine = new EngineImplementation; $car->setEngine($engine); }
如果您传入,则上面的代码会崩溃WaterCar,因为它不接受Engine。