Почему нельзя переопределить construct при наследовании? Вот просто пример: (php5)class T{
public function __construct(){}
}class S extends T{
private function __construct(){
// code
}
}
Ругань идет по причине того, что php не хочет делать из public private. Но почему?
Идея в том, чтобы запретить создавать экземпляры объекта S в последствии сделав его синглтоном.
Придумал некий хук, но он работает пока есть совместимость (я так понял):class S extends T{
private function S(){
// код
}
}
Тогда все прокатывает и сделать что-то типа того$s = new S();
уже не получается.

21 Авг 2019 в 07:06
190 +1
0
Ответы
1

В PHP нельзя переопределить конструктор (__construct) при наследовании из-за того, что конструктор не является обычным методом класса. Конструктор имеет особое значение и вызывается автоматически при создании нового объекта класса. Поэтому PHP не позволяет изменять его уровень доступа, так как это может привести к непредсказуемым результатам и нарушению принципов ООП.

В вашем примере, попытка объявить конструктор в классе-потомке как private вызывает ошибку, так как вы пытаетесь изменить область видимости метода, который должен быть доступен извне для создания объекта.

Если вам нужно ограничить создание экземпляров объекта S и сделать его синглтоном, лучше воспользоваться паттерном Singleton, который предусматривает статический метод для создания единственного экземпляра класса.

Пример использования Singleton в PHP:

class S {
private static $instance;
private function __construct() {
// код инициализации
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
// Создание экземпляра
$s = S::getInstance();

Таким образом, вы можете обеспечить ограниченное создание экземпляров и контроль над объектом класса S без изменения конструктора.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир