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

 
/

 
/

 
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 .

 
/

 
/

 
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 .

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

 
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 .