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) {}
}