Manual do PHP
Anterior | Capítulo 13. Classes e Objetos | Próxima

# `Construtores`

Cuidado
Os construtores se comportam diferentemente entre o PHP 3 e o PHP 4. A semântica do PHP 4 é atualmente preferencial.

Construtores são funções numa classe que são automaticamente chamados quando você cria uma nova instância da classe com `new`. No PHP 3, uma função se torna um construtor quando ele tem o mesmo nome da classe. No PHP 4, uma função se torna um construtor quando ele tem o mesmo nome da classe onde ela foi definida (a diferença é sutil, mas crucial --- veja abaixo).

`<?php // Funciona no PHP 3 e 4 class CarrinhoDeComprasAutomatico extends CarrinhoDeCompras { function CarrinhoDeComprasAutomatico() { $this->add_item ("10", 1); } } ?>`

Isto define uma classe chamada CarrinhoDeComprasAutomatico que é um CarrinhoDeCompras mais um construtor que inicializa o carrinho com um item do artigo numero "10" cada vez que um novo CarrinhoDeComprasAutomatico for criado com "new". Construtores pode ter argumentos e esses argumentos podem ser opcionais, o que os torna muito mais práticos. Para permitir a criação de classes sem parâmetros, todos os parâmetros dos construtores pode ser feitos opcionais simplesmente por terem valores default.

`<?php // Funciona no PHP 3 e 4 class CarrinhoDeComprasComConstrutor extends CarrinhoDeCompras { function CarrinhoDeComprasComConstrutor($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Fazendo compras do mesmo modo antigo $carrinho_default = new CarrinhoDeComprasComConstrutor; // Fazendo compres de verdade $carrinhho_diferente = new CarrinhoDeComprasComConstrutor("20", 17); ?>`

Você pode usar o operador `@` para esconder erros gerados no construtor do objeto, por exemplo: `@new`.

Cuidado
No PHP 3, classes derivadas e construtores tem uma série de limitações. Os exemplo seguintes precisam ser lidos cuidadosamente para que você entenda essas limitações.

`<?php class A { function A() { echo "Eu sou o construtor de A.<br />\n"; } } class B extends A { function C() { echo "Eu sou uma função normal.<br />\n"; } } // nenhum construtor é chamado no PHP 3 $b = new B; ?>`

No PHP 3, nenhum construtor é chamado no exemplo acima. A regra no PHP 3 é: 'Um construtor é uma função com o mesmo nome da classe'. O nome da classe é B, e não há nenhuma função chamada B() na classe B. Nada ocorre.

Isto foi corrigido no PHP 4 pela instrução de outra regra: Se uma classe não tem construtor, o construtor da classe base é chamado, se existir. O exemplo acima teriam impresso 'Eu sou o construtor de A.<br />' no PHP 4.

`<?php class A { function A() { echo "Eu sou o construtor de A.<br />\n"; } function B() { echo "Eu sou uma função normal chamada B na classe A.<br />\n"; echo "Eu não sou o construtor de A.<br />\n"; } } class B extends A { function C() { echo "Eu sou uma função normal.<br />\n"; } } // Isto irá chamar B() como um construtor. $b = new B; ?>`

No PHP 3, a função B() na classe A se tornará silenciosamente um construtor na classe B, mesmo que isso nunca tenha sido planejado. A regra no PHP 3 é: 'Um construtor é uma função com o mesmo nome da classe'. PHP 3 não se preocupa se a função foi definida na classe B, ou se ela foi herdada.

Isto foi corrigido no PHP 4 pela modificação da regra para: 'Um construtor é uma função com o mesmo nome da classe onde ela é definida.'. Assim, no PHP 4, como a classe B não tem nenhuma função construtora definida nela mesma então o construtor da classe base será chamado, imprimindo 'Eu sou o construtor de A.<br />'.

Cuidado
Nem o PHP 3 ou o 4 chamam automaticamente os construtores da classe base a partir do construtor da classe derivada. É de sua responsabilidade propagar a chamada dos construtores herança acima, onde apropriado.

> Nota: Não existem destrutores no PHP 3 ou 4. Mas você pode usar register_shutdown_function() para simular a maioria dos efeitos de destrutores.

Destrutores são funções que são chamadas automaticamente quando um objeto é destruído, ou pela utilização de unset() ou pela simples saída do escopo. Não existem destrutores no PHP.

Anterior | Principal | Próxima
`extends` | Acima | `::`