Попробуйте здесь:
Справка ubuntu
прокрутите вниз до раздела FAT32 и FAT16.
Это запрещено, потому что это нарушает принцип замены Лискова:
Контравариантность аргументов метода в подтипе.Это означает, что метод можно изменить, но только если вы расширите ограничение типа. На данный момент PHP не поддерживает реальный принцип замены Лискова . В это время вы можете использовать простое расширение типа параметра - это означает, что при реализации интерфейса вы можете опустить тип параметра.
С точки зрения ООП: вы меняете подпись функции:
В реализации вы также должны использовать:
public function translate(Model $model){}
И вы можете передать аргументы типа MyModel для этого function
Все MyModel - это Model, но не все Model MyModel, вы можете иметь другие реализации Модели, которые могут быть переданы функции, но не являются MyModel.
EDIT1 : В соответствии с вашим комментарием:
вы можете проверить каждую имплиментацию, если это инстанс требуемого класса:
Class MyTranslator implements TranslatorInterface {
public function translate(Model $model) {
if (is_a($model, 'MyModel')) {
echo "yes, you use to translate MyModel \n";
}
}
}
В зависимости от контекста вы можете использовать это решение, но я думаю, что решение, использующее _constructor, лучше подходит для этого с небольшим изменением:
Class MyTranslator implements TranslatorInterface {
public function __construct(Model $model) {
$this->model = $model;
}
public function translate() {
$this->model->doSomething();
...
}
}
Вам нужен только один конструктор, и он будет использовать правильную имплиментацию на основе полиморфизма.