Если у меня есть родительский класс, который расширяется партиями и много других классов, и я хочу удостовериться, что конструктор родительского класса ВСЕГДА выполняется, это плохая идея объявить конструктора final
?
Я думал о выполнении чего-то вроде этого:
class ParentClass {
public final function __construct() {
//parent class initialization...
$this->construct();
}
protected function init() {
echo 'constructing<br>';
}
}
class ChildClass extends ParentClass {
protected function init() {
//child class initialization
echo 'constructing child<br>';
}
}
тем путем дочерний класс может иметь своего рода конструктора, и конструктор родительского класса будет всегда выполняться. Эта плохая практика?
Объявление final
__construct
гарантирует, что никто, кто расширяет ваш класс, не сможет реализовать метод с таким же именем. Внешне это выглядит так, как будто никто другой не может объявить конструктор для подклассов этого класса, но это не так, так как PHP 4 в стиле ClassName()
все еще прекрасно работает как альтернативное имя для конструктора. Так что на самом деле, объявление конструктора окончательным ничего не даст вам в PHP.
После завершения работы конструктора нельзя передавать никакие переменные в инициализирующую функцию. Это заставляет пользователей вашего класса использовать глобулы в качестве настроек для своих дочерних классов.
В Zend Framework использование переопределяемой функции init() является обычной практикой, но я никогда не видел там доработки конструктора.