Um construtor PHP é um método chamado __construct(). O PHP o chama automaticamente quando você escreve new ClassName(...), e os argumentos entre parênteses viram os parâmetros dele, então o objeto já começa com os valores definidos.
Sem construtor, você criaria um objeto vazio e definiria cada propriedade depois, e nada impediria você de esquecer uma. Com um construtor, new User() sem argumentos é um ArgumentCountError.
Promoção de propriedades no construtor
Declarar uma propriedade, listá-la como parâmetro e atribuir $this->name = $name repete cada nome três vezes. Desde o PHP 8.0, uma palavra-chave de visibilidade na frente de um parâmetro do construtor faz as três coisas de uma vez:
Um parâmetro promovido também pode ser readonly (public readonly string $id), que é o jeito mais curto de escrever um objeto de valor imutável. Você pode misturar parâmetros promovidos e normais, e o corpo do construtor ainda pode conter código que roda depois que as propriedades promovidas foram atribuídas.
Valores padrão e argumentos nomeados
Parâmetros do construtor aceitam padrões como em qualquer função. Parâmetros com padrão vêm depois dos obrigatórios. Com argumentos nomeados (PHP 8.0), quem chama pode ir direto à opção que quer em vez de repetir todos os padrões antes dela:
Rode: a saída contém HTML, então a aba Page mostra os três botões renderizados, e a aba Output mostra as tags que o PHP imprimiu. Repare nos parênteses em (new Button('Save'))->render(): desde o PHP 8.4 eles são opcionais, mas o PHP 8.3 precisa deles.
Validar argumentos no construtor
Um construtor não pode retornar false ou um código de erro: o que ele retornar é ignorado. Para recusar uma entrada inválida, lance uma exceção. O objeto então nunca é criado, e o resto do programa pode confiar em cada Temperature que recebe.
A página sobre try catch explica em mais detalhe como capturar essas exceções.
Vários construtores com métodos de fábrica estáticos
O PHP não tem sobrecarga de construtores: uma classe, um __construct. Quando um objeto pode ser montado a partir de entradas diferentes (uma string de data, um array, um timestamp), adicione métodos estáticos com nome que preparam os argumentos e chamam new static(...). Tornar o construtor private obriga todo mundo a passar pelas fábricas.
new Color(1, 2, 3) de fora da classe agora lança um Error ("Call to private Color::__construct() from global scope"). A página sobre static explica por que se usa new static aqui em vez de new self.
Chamar o construtor da classe pai com parent::__construct
Quando uma classe filha define o próprio construtor, o construtor da classe pai não roda sozinho. Chame-o com parent::__construct(...), normalmente primeiro, para que as propriedades da classe pai estejam definidas antes de a filha adicionar as suas:
Se a filha não tem construtor nenhum, o PHP usa o da classe pai, e new Truck('Volvo') passaria os argumentos direto para Vehicle::__construct. Mais sobre isso em herança.
Esquecer o parent::__construct
Esse erro não gera nenhuma mensagem na linha em que acontece. O construtor da filha roda, as propriedades tipadas da classe pai ficam não inicializadas, e o programa falha depois, onde quer que aconteça a primeira leitura:
Adicione parent::__construct(); como primeira linha de Post::__construct e rode de novo: ele imprime a data. Um método relacionado, __destruct(), roda quando a última referência a um objeto desaparece ou o script termina. Ele raramente é necessário no código do dia a dia, porque o PHP fecha arquivos e libera memória sozinho no fim de cada requisição.
Perguntas frequentes
O que é __construct no PHP?
__construct() é o construtor: um método que o PHP chama automaticamente logo depois que o new cria o objeto. Os argumentos que você passa em new User('Ada', 36) vão para __construct(string $name, int $age), que normalmente os guarda em propriedades.
O que é a promoção de propriedades no construtor do PHP?
Desde o PHP 8.0, colocar uma palavra-chave de visibilidade num parâmetro do construtor declara a propriedade e a atribui num passo: public function __construct(private string $name) {} é o mesmo que declarar private string $name; e escrever $this->name = $name; no corpo.
Uma classe PHP pode ter vários construtores?
Não. O PHP não tem sobrecarga de métodos, então uma classe tem um __construct. Use parâmetros opcionais com padrão, ou adicione métodos de fábrica estáticos como public static function fromArray(array $data): static, que chamam new static(...) com os argumentos certos.
O construtor da classe pai é chamado automaticamente no PHP?
Só quando a classe filha não tem construtor próprio. Se a filha define __construct, o construtor da classe pai não roda, a menos que você chame parent::__construct(...) você mesmo, normalmente na primeira linha.
Um construtor PHP pode retornar um valor?
Não. O new sempre dá o objeto, e o que o __construct retornar é ignorado. Para informar um problema, lance uma exceção no construtor, por exemplo throw new InvalidArgumentException('Age must be positive').