У меня есть следующий интерфейс / классы:
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) {}
}
Почему я не могу использовать объект Engine в дочерней подписи (Hybrid Class), если Engine является подклассом «Part» (я знаю, что это возможно в Java …)
Как правильно добиться этой функциональности в PHP?
Спасибо
Да, 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) {}
}
Короче говоря, интерфейс предназначен для того, чтобы предоставить вам эти ограничения, устанавливая конкретные инструкции для ваших объектов. Таким образом, при проверке возможностей объекта или с instanceof
Вы всегда можете ожидать получить то, что было указано.
Не существует «правильного» способа достичь того, что вы хотите сделать, но предлагаемый метод заключается в подсказке типа с интерфейсами, в отличие от конкретных определений классов.
Таким образом, вы всегда можете гарантировать доступные методы для предоставленных объектов.
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));
}
}
}