PHP 覆盖子项中的接口签名 class
PHP Override Interface signature in child class
我有以下界面/classes:
class Part {}
class Engine extends Part{}
interface CarsInterface {
public function selectTimeLine(Part $object);
}
abstract class Car implements CarsInterface {}
class Hybrid extends Car {
public function selectTimeLine(Engine $object) {}
}
如果引擎是 "Part" 的子 class,为什么我不能在子签名(混合 Class)中使用引擎对象(我知道它可能在 Java...)
在 PHP 中实现此功能的正确方法是什么?
谢谢
简而言之,界面旨在通过为您的对象设置特定说明来为您提供这些限制。这样,在检查对象的功能或使用 instanceof
时,您总是可以期望收到指定的内容。
没有 "proper" 方法可以实现您想要做的事情,但建议的方法是使用接口类型提示而不是特定 class 定义。
这样您就可以始终保证所提供对象的可用方法。
interface TimeLineInterface { }
class Part implements TimeLineInterface { }
class Engine extends Part { }
interface CarInterface
{
public function selectTimeLine(TimeLineInterface $object);
}
abstract class Car implements CarInterface { }
class Hybrid extends Car
{
public function selectTimeLine(TimeLineInterface $object) { }
}
如果你想强制接受对象方法的特定类型的对象,你需要像这样检查对象实例。
class Hybrid extends Car
{
public function selectTimeLine(TimeLineInterface $object)
{
if (!$object instanceof Engine) {
throw new \InvalidArgumentException(__CLASS__ . '::' . __FUNCTION__ . ' expects an instance of Engine. Received ' . get_class($object));
}
}
}
是的,PHP 很烂。 =)
如果我没记错的话,你需要这样的东西:
interface SomeInterface {
}
class Part implements SomeInterface {}
class Engine extends Part implements SomeInterface{}
interface CarsInterface {
public function selectTimeLine(SomeInterface $object);
}
abstract class Car implements CarsInterface {}
class Hybrid extends Car {
public function selectTimeLine(SomeInterface $object) {}
}
我有以下界面/classes:
class Part {}
class Engine extends Part{}
interface CarsInterface {
public function selectTimeLine(Part $object);
}
abstract class Car implements CarsInterface {}
class Hybrid extends Car {
public function selectTimeLine(Engine $object) {}
}
如果引擎是 "Part" 的子 class,为什么我不能在子签名(混合 Class)中使用引擎对象(我知道它可能在 Java...)
在 PHP 中实现此功能的正确方法是什么? 谢谢
简而言之,界面旨在通过为您的对象设置特定说明来为您提供这些限制。这样,在检查对象的功能或使用 instanceof
时,您总是可以期望收到指定的内容。
没有 "proper" 方法可以实现您想要做的事情,但建议的方法是使用接口类型提示而不是特定 class 定义。
这样您就可以始终保证所提供对象的可用方法。
interface TimeLineInterface { }
class Part implements TimeLineInterface { }
class Engine extends Part { }
interface CarInterface
{
public function selectTimeLine(TimeLineInterface $object);
}
abstract class Car implements CarInterface { }
class Hybrid extends Car
{
public function selectTimeLine(TimeLineInterface $object) { }
}
如果你想强制接受对象方法的特定类型的对象,你需要像这样检查对象实例。
class Hybrid extends Car
{
public function selectTimeLine(TimeLineInterface $object)
{
if (!$object instanceof Engine) {
throw new \InvalidArgumentException(__CLASS__ . '::' . __FUNCTION__ . ' expects an instance of Engine. Received ' . get_class($object));
}
}
}
是的,PHP 很烂。 =)
如果我没记错的话,你需要这样的东西:
interface SomeInterface {
}
class Part implements SomeInterface {}
class Engine extends Part implements SomeInterface{}
interface CarsInterface {
public function selectTimeLine(SomeInterface $object);
}
abstract class Car implements CarsInterface {}
class Hybrid extends Car {
public function selectTimeLine(SomeInterface $object) {}
}