Это нормальное поведение, что дочерний класс не может реализовать тот же интерфейс родительского класса реализует? Я получил PHP v5.6
interface blueprint {
public function implement_me();
}
class one implements blueprint {
public function implement_me() {
}
}
class two extends one implements blueprint {}
//no fatal error triggered for class two
РЕДАКТИРОВАТЬ: Так что приведенный выше код прекрасно работает без ошибок и предупреждений, хотя я реализовал интерфейс blueprint
в детском классе two
не имея метода impement_me()
почему дочерний класс не может реализовать тот же интерфейс, который реализует родительский класс?
если я реализую другой интерфейс, кроме blueprint
для класса two
тогда это работает, и я должен использовать blueprint_new
методы внутри класса two
в противном случае произошла фатальная ошибка. Эта часть работает как задумано.
interface blueprint {
public function implement_me();
}
class one implements blueprint {
public function implement_me() {
}
}interface blueprint_new {
public function todo();
}class two extends one implements blueprint_new {}
//this will trigger fatal error.
Дочерний класс автоматически наследует все интерфейсы от родительского класса.
Иногда вы не хотите этого, но вы все еще можете реализовать любой, даже несколько интерфейсов в дочернем классе.
Единственное, что не работает, — это расширение интерфейса, так же как класс (или абстрактный класс) не может быть реализован.
Ошибка, вызванная вашим вторым кодом, заключается в том, что вы не реализовали все методы интерфейса blueprint_new
в классе two
, но в принципе в вашем коде нет ничего плохого.
Пример:
class MobilePhone implements GsmSignalPowered {}
class SamsungGalaxy extends MobilePhone implements UsbConnection {}
interface ThunderboltPowered {}
interface GsmSignalPowered {}
interface UsbConnection {}
$s = new SamsungGalaxy();
var_dump($s instanceof GsmSignalPowered); // true
var_dump($s instanceof UsbConnection); // true
var_dump($s instanceof ThunderboltPowered); // false
$m = new MobilePhone();
var_dump($m instanceof GsmSignalPowered); // true
var_dump($m instanceof UsbConnection); // false
var_dump($m instanceof ThunderboltPowered); // false
Других решений пока нет …