Какая разница между public и private в случае с конструктором PHP-класса и на каких основаниях следует выбирать модификатор доступа для конструктора класса?
Объект класса с 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();
Сборка персонального компьютера от Artline: умный выбор для современных пользователей