PHP constructor: private или public?

200
02 февраля 2018, 23:13

Какая разница между public и private в случае с конструктором PHP-класса и на каких основаниях следует выбирать модификатор доступа для конструктора класса?

Answer 1

Объект класса с public конструктором может быть создан в любом месте программы через new classname

Объект класса с private конструктором может быть создан только в пределах методов этого самого класса (например, в статическом методе)

Поэтому private конструктор используется тогда, когда вы хотите чтобы объекты этого класса создавались только определённым образом из одного или нескольких статических методов этого класса и не могли свободно создаваться во внешнем коде. Например, это необходимо для паттерна одиночка (singleton)

Относительно упомянутого в комментариях наследования - существует ещё protected уровень. Конструктор возможно наследовать, но всё ещё невозможно создать объект класса извне класса. И важный момент - наследники могут расширять область видимости метода и это не является нарушением контракта класса и наследования. Т.е. класс наследник может объявить свой конструктор публичным, даже если у базового класса конструктор был private или protected. Нередко при этом делается final protected конструктор, из которого вызывается другой метод, который может переопределить наследник - так сохраняется и возможность выполнить какую-то логику инициализации и гарантировать, что конструктор класса не станет публичным

class foo {
    public static function create() {
        return new static;
    }
    final protected function __construct() {
        $this->init();
    }
    protected function init() {}
}
class bar extends foo {
    protected function init() {
        var_dump(__METHOD__);
    }
}
bar::create();
READ ALSO
Оптимизация изображений с Imagepick

Оптимизация изображений с Imagepick

Есть скрипт на сервере, который декодирует изображение base64 и загружает на сервер и скрипт, который оптимизирует его после загрузкиХотелось...

169
В чем ошибка PHP

В чем ошибка PHP

когда отправляю запрос на этот php получаю ошибку 500 в php я практический вообще не разбираюсь помогите пожалйуста на этот файл передается пост...

164
Переопределение свойства объекта в Yii2

Переопределение свойства объекта в Yii2

Все-таки мучает меня этот вопрос, может быть кто-то сможет объяснить

164
Регулярное выражения для логина

Регулярное выражения для логина

Здравствуйтепрошу помощи в написании регулярки для проверки логина при регистрации пользователя

228