Почему нельзя переопределить 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();
уже не получается.
  • Вопрос задан
  • 558 просмотров
Пригласить эксперта
Ответы на вопрос 2
mr_T
@mr_T
Web-разработчик
Потому что при наследовании нельзя изменять доступность функции. Если нужен синглтон, то ты по определению не сможешь унаследоваться от класса с открытым конструктором. А сделано это для того, чтобы объект любого класса, унаследованного от данного, гарантированно обладал всеми функциями родителя, в частности и возможностью создания новых объектов. Иначе теряется смысл наследования.
Ответ написан
@matperez
Вот тут хорошая дискуссия на эту тему: https://bugs.php.net/bug.php?id=40880

Как вариант, если хотите обернуть какой-то объект в синглтон, используйте делегирование а не наследование
class D
{
    public function __construct()
    {
    }
}

class S
{
    private static $instance = null;

    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new D();
        }
        return self::$instance;
    }

    private function __construct()
    {
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы