#php #constructor
#php #конструктор
Вопрос:
В моем примере у меня есть 2 интерфейса и 2 класса.
Интерфейсы:
interface I {
public function __construct() { ... }
}
interface J {
public function __construct($var1, $var2) { ... }
}
interface K {
public function __construct($var) { ... }
}
Классы
class A implements I {
public function __construct() { ... }
}
class B extends A implements J {
public function __construct($var1, $var2) {
parent::__construct();
...
}
}
class C extends B implements K {
public function __construct($var) {
parent::__construct('var1', 'var2');
...
}
}
Как вы можете видеть, все классы строятся друг на друге. Мне также нужны интерфейсы, потому что существует несколько «типов» классов A
, B
и C
.
Как я могу этого добиться, потому что конструктор в классе C
сообщает мне следующее сообщение об ошибке:
Объявление должно быть совместимо с J-> __construct($ var1, $ var2).
Заранее спасибо!
Комментарии:
1. Почему вы добавили конструкторы в свои интерфейсы? Действительно ли имеет значение с точки зрения пользователей этих классов, сколько параметров должно быть передано в конструктор?
2. До того, как у меня возникла эта ошибка, я думал, что это было чище в отношении моего варианта использования. Но если единственным решением для исправления этой ошибки является удаление конструкторов в интерфейсах, я это сделаю.
3. Если интерфейс определяет конструктор, все реализующие классы должны использовать этот конструктор. Вы можете переопределить конструктор, только если его нет в интерфейсе. Вы можете попробовать использовать вариационный конструктор или
func_get_args
, если вам нужно несколько подписей конструктора.4. @Jan Это не единственный способ — это правильный способ. 🙂 Опять же, интерфейсы позволяют вашим объектам , созданным с использованием разных классов, вести себя одинаково с точки зрения их пользователей. Добавление конструкторов к интерфейсам означает, что эти пользователи также должны каким-то образом отвечать за создание экземпляров этих объектов.
5. Я думаю, вы искали абстракцию класса вместо интерфейсов классов. Интерфейсы предназначены для выполнения функций инструкций или требований к реализации.