Menu

Construtor PHP: __construct e promoção de propriedades

Um construtor PHP é o método __construct(), que roda automaticamente quando você escreve new ClassName(...). Veja a promoção de propriedades no construtor, argumentos padrão e nomeados, validação, parent::__construct() e como simular vários construtores com métodos de fábrica estáticos.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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').

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR