Со страницы документов http://php.net/manual/en/language.oop5.typehinting.php
Если класс или интерфейс указан как подсказка типа, то разрешены также все его дочерние элементы или реализации.
Но:
class PimpleChild extends Pimple {
//...
}
interface Pimple_Config {
public function configure(Pimple $container);
}
class PimpleConfigurer_Factories implements Pimple_Config {
public function configure(PimpleChild $container) {
//...
}
}
возвращает фатальную ошибку. Зачем?
Если я не ошибаюсь, вы получаете эту ошибку:
Declaration of PimpleConfigurer_Factories::configure() must be compatible with Pimple_Config::configure(Pimple $container) ...
Что означает: если вы определяете метод в суперклассе или в интерфейсе, все подклассы (или классы, реализующие интерфейс) должны использовать именно это определение. Вы не можете использовать другой тип здесь.
Что касается вашей цитаты из документации:
Если класс или интерфейс указан как подсказка типа, то разрешены также все его дочерние элементы или реализации.
Это означает только то, что вы можете передать переменную определенного типа или всех ее потомков.
Например: скажем, у вас есть следующие классы:
class Car {
protected $hp = 50;
public function getHp() { return $this->hp; }
}
class SuperCar extends Car {
protected $hp = 700;
}
И функция (или метод, никакой разницы там) с подсказкой типа:
function showHorsePower(Car $car) {
echo $car->getHp();
}
Теперь вы можете передать все объекты типа Car и все его подклассы (здесь SuperCar) в эту функцию, например:
showHorsePower(new Car());
showHorsePower(new SuperCar());
Из того же раздел ввода текста, на который вы ссылаетесь:
Класс, реализующий интерфейс, должен использовать те же сигнатуры методов, которые определены в интерфейсе. Невыполнение этого приведет к фатальной ошибке.
Чтобы сигнатуры методов были одинаковыми, они должны содержать точно такие же шрифты. А также актуально, потому что это похоже …
Из ООП Основы — extends
раздел руководства:
При переопределении методов сигнатура параметра должна оставаться неизменной, иначе PHP сгенерирует
E_STRICT
ошибка уровня Это не относится к конструктору, который позволяет переопределять другие параметры.