Não necessariamente, ele pode ser tanto público como privado ou protegido.
O construtor pode ser private ou protected para evitar que ele seja chamado externamente. Nesses casos apenas um construtor estático será capaz de instanciar a classe. Por eles estarem nas mesma definição de classe, os métodos estáticos são capazes de instanciar o objeto, mesmo em uma instância diferente. O construtor privado é opcional e pode não fazer sentido em todos os casos. - Fonte: Documentação do PHP
Você pode olhar mais detalhes na documentação