Если наследник переопределяет конструктор — он должен вызвать parent::__construct(), иначе логика родителя потеряется.
// PluginOptions.php
protected function __construct()
{
// своя логика...
$this->setSections($all_options);
parent::__construct(); // ← вызываем конструктор Options
}
Когда наследник определяет свой __construct() — он полностью заменяет конструктор родителя. PHP не вызывает оба — только тот, что ближе.
class PluginOptions extends Options
{
protected function __construct()
{
// ← PHP выполняет ТОЛЬКО этот конструктор
// ← конструктор Options::__construct() НЕ вызывается автоматически
// ← если в Options есть инициализация — она потеряна
}
}
parent::__construct() — явный вызов конструктора родителя. Без него — код родительского конструктора не выполнится.
Порядок вызова имеет значение.
// PluginOptions.php
protected function __construct()
{
// 1. Сначала СВОЯ логика:
GlobalOptions::init();
$this->setSections($all_options); // ← заполняет секции
// 2. Потом РОДИТЕЛЬ:
parent::__construct(); // ← может использовать уже заполненные секции
}
Здесь parent::__construct() вызывается в конце — потому что родитель может зависеть от данных, которые наследник подготовил (секции должны быть уже заполнены).
Бывает и наоборот:
// Если родитель должен инициализировать базу первым:
protected function __construct()
{
parent::__construct(); // ← сначала родитель
// потом своя логика
}