Вкратце, интерфейс предназначен для предоставления вам этих ограничений путем установки конкретных инструкций для ваших объектов. Таким образом, при проверке возможностей объекта или с помощью 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));
}
}
}
Там есть несколько вопросов, которые касаются этого. Это кажется наиболее перспективным, предлагает использовать instanceof: http://programmers.stackexchange.com/questions/227766/changing-method-signature-for-implementing-classes-in-php Вот один из SO: http: // stackoverflow .com/questions/13423494/why-is-overriding-method-parameters-a-нарушение-strict-standards-in-php. Лучше всего, вероятно, удалить тип из объявления аргумента и использовать 'instanceof'. –
@MontgomeryJean Я увидел второй ответ, озираясь по сторонам ... но можете ли вы подробнее остановиться на «instanceof», можете ли вы привести пример? –
никогда не видел ... видел. –